一.需求分析
- 从 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 commons
import "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)//图片上传
}