一.需求分析

  • 从 02资料/章节211商品新增中上传图片 下把资源拷贝到项目中
  • 商品新增中上传图片使用的是KindEditor的多文件上传组件.文件上传为异步上传方式.可以上传多个文件.
  • 当文件上传后要求服务器端返回数据格式如下.应该是map转换为json而不应该是结构体转换为json
    • error:表示图片上传的状态
    • url:表示图片上传后回显地址
    • message:表示图片上传失败后显示的内容
  1. //成功时
  2. {
  3. "error" : 0,
  4. "url" : "http://www.example.com/path/to/file.ext"
  5. }
  6. //失败时
  7. {
  8. "error" : 1,
  9. "message" : "错误信息"
  10. }
  • 上传图片域的默认名称为imgFile
  • 多文件上传本质是每次上传一张图片,多次调用同一个控制器
  • 在保存图片时要考虑图片重名的问题,使用随机数+时间戳保证图片名称唯一

二.代码演示

  • 在commons/CommonsVars.go 添加全局变量,表示当前项目的URL.同时设定json相关两个变量
  1. package commons
  2. import "github.com/gorilla/mux"
  3. var (
  4. Router = mux.NewRouter()
  5. CurrPath = "http://localhost:80/" //当前项目url
  6. HEADER_CONTENT_TYPE = "Content-Type" //Content-Type
  7. JSON_HEADER = "application/json;charset=utf-8" //json
  8. )
  • 在item/TbItemService.go添加函数实现图片上传
  1. func imageUploadService(f multipart.File, h *multipart.FileHeader) map[string]interface{} {
  2. m := make(map[string]interface{})
  3. b, err := ioutil.ReadAll(f)
  4. if err != nil {
  5. m["error"] = 1
  6. m["message"] = "上传失败,服务器错误"
  7. return m
  8. }
  9. //纳秒时间戳+随机数+扩展名
  10. rand.Seed(time.Now().UnixNano())
  11. fileName := "static/images/" + strconv.Itoa(int(time.Now().UnixNano())) + strconv.Itoa(rand.Intn(1000)) + h.Filename[strings.LastIndex(h.Filename, "."):]
  12. err = ioutil.WriteFile(fileName, b, 0777)
  13. if err != nil {
  14. m["error"] = 1
  15. m["message"] = "上传失败,保存图片时错误"
  16. return m
  17. }
  18. m["error"] = 0
  19. m["url"] = commons.CurrPath + fileName
  20. return m
  21. }
  • 在item/TbItemController.go添加函数,并配置映射
  1. //图片上传
  2. func imagesUploadController(w http.ResponseWriter, r *http.Request) {
  3. file,fileHeader,err:=r.FormFile("imgFile")
  4. if err!=nil{
  5. m:=make(map[string]interface{})
  6. m["error"]=1
  7. m["message"]="接收图片失败"
  8. b,_:=json.Marshal(m)
  9. w.Header().Set(commons.HEADER_CONTENT_TYPE,commons.JSON_HEADER)
  10. w.Write(b)
  11. return
  12. }
  13. m:=imageUploadService(file,fileHeader)
  14. b,_:=json.Marshal(m)
  15. w.Header().Set(commons.HEADER_CONTENT_TYPE,commons.JSON_HEADER)
  16. w.Write(b)
  17. }
  18. func ItemHandler() {
  19. commons.Router.HandleFunc("/showItem", showItemController)
  20. commons.Router.HandleFunc("/item/delete", delByIdsController)
  21. commons.Router.HandleFunc("/item/instock", instockController)
  22. commons.Router.HandleFunc("/item/offstock", offstockController)
  23. commons.Router.HandleFunc("/item/imageupload", imagesUploadController)//图片上传
  24. }