一.需求分析
- 从 02资料/章节211商品新增中上传图片 下把资源拷贝到项目中
- 商品新增中上传图片使用的是KindEditor的多文件上传组件.文件上传为异步上传方式.可以上传多个文件.
- 当文件上传后要求服务器端返回数据格式如下.应该是map转换为json而不应该是结构体转换为json
- error:表示图片上传的状态
- url:表示图片上传后回显地址
- message:表示图片上传失败后显示的内容
//成功时{ "error" : 0, "url" : "http://www.example.com/path/to/file.ext"}//失败时{ "error" : 1, "message" : "错误信息"}
- 上传图片域的默认名称为imgFile
- 多文件上传本质是每次上传一张图片,多次调用同一个控制器
- 在保存图片时要考虑图片重名的问题,使用随机数+时间戳保证图片名称唯一
二.代码演示
- 在commons/CommonsVars.go 添加全局变量,表示当前项目的URL.同时设定json相关两个变量
package commonsimport "github.com/gorilla/mux"var ( Router = mux.NewRouter() CurrPath = "http://localhost:80/" //当前项目url HEADER_CONTENT_TYPE = "Content-Type" //Content-Type JSON_HEADER = "application/json;charset=utf-8" //json)
- 在item/TbItemService.go添加函数实现图片上传
func imageUploadService(f multipart.File, h *multipart.FileHeader) map[string]interface{} { m := make(map[string]interface{}) b, err := ioutil.ReadAll(f) if err != nil { m["error"] = 1 m["message"] = "上传失败,服务器错误" return m } //纳秒时间戳+随机数+扩展名 rand.Seed(time.Now().UnixNano()) fileName := "static/images/" + strconv.Itoa(int(time.Now().UnixNano())) + strconv.Itoa(rand.Intn(1000)) + h.Filename[strings.LastIndex(h.Filename, "."):] err = ioutil.WriteFile(fileName, b, 0777) if err != nil { m["error"] = 1 m["message"] = "上传失败,保存图片时错误" return m } m["error"] = 0 m["url"] = commons.CurrPath + fileName return m}
- 在item/TbItemController.go添加函数,并配置映射
//图片上传func imagesUploadController(w http.ResponseWriter, r *http.Request) { file,fileHeader,err:=r.FormFile("imgFile") if err!=nil{ m:=make(map[string]interface{}) m["error"]=1 m["message"]="接收图片失败" b,_:=json.Marshal(m) w.Header().Set(commons.HEADER_CONTENT_TYPE,commons.JSON_HEADER) w.Write(b) return } m:=imageUploadService(file,fileHeader) b,_:=json.Marshal(m) w.Header().Set(commons.HEADER_CONTENT_TYPE,commons.JSON_HEADER) w.Write(b)}func ItemHandler() { commons.Router.HandleFunc("/showItem", showItemController) commons.Router.HandleFunc("/item/delete", delByIdsController) commons.Router.HandleFunc("/item/instock", instockController) commons.Router.HandleFunc("/item/offstock", offstockController) commons.Router.HandleFunc("/item/imageupload", imagesUploadController)//图片上传}