package file import ( "crypto/md5" "errors" "fmt" "github.com/fishtailstudio/imgo" "github.com/gabriel-vasile/mimetype" "github.com/gin-gonic/gin" "github.com/spf13/viper" "io" "net/http" "os" "path" "product/backend/moo/log" "time" ) // 上传图片 func UploadImage(ctx *gin.Context) { data, err := UploadFunc(ctx, fieldName, "image") if err != nil { log.Error(err) ctx.JSON(http.StatusOK, gin.H{ "code": 1, "massage": "图片上传错误", }) return } ctx.JSON(http.StatusOK, gin.H{ "code": 0, "data": data, }) } func Upload(ctx *gin.Context) { data, err := UploadFunc(ctx, fieldName, "") if err != nil { log.Error(err) ctx.JSON(http.StatusOK, gin.H{ "code": 1, "massage": "文件上传错误", }) return } ctx.JSON(http.StatusOK, gin.H{ "code": 0, "data": data, }) } func UploadFunc(ctx *gin.Context, field, fileType string) (gin.H, error) { formFile, err := ctx.FormFile(field) if err != nil { return nil, err } // open file file, err := formFile.Open() if err != nil { return nil, err } // default ext ext := path.Ext(formFile.Filename) if fileType == "image" { // mime detect typeMime, err := mimetype.DetectReader(file) if err != nil { return nil, err } if _, exists := imageMimes[typeMime.String()]; !exists { err := errors.New("上传图片类型错误") return nil, err } ext = typeMime.Extension() } // md5 h := md5.New() if _, err := io.Copy(h, file); err != nil { return nil, err } fileMd5 := fmt.Sprintf("%x", h.Sum(nil)) // save t := fmt.Sprintf("%d", time.Now().UnixMilli()) filename := fileMd5 + t + ext // sub-path subPath := "" for i := 0; i < PathDeep; i++ { subPath += fileMd5[i*PathLen:(i+1)*PathLen] + "/" } if err := os.MkdirAll(SavePath+subPath, 0644); err != nil { return nil, err } dst := SavePath + subPath + filename if err := ctx.SaveUploadedFile(formFile, dst); err != nil { return nil, err } // compress compressFilename := fileMd5 + t + "compress" + ".jpg" var compressSize int64 if fileType == "image" { if err := imgo.Load(dst).Save(SavePath+subPath+compressFilename, viper.GetInt("app.jpegQuality")).Error; err != nil { log.Error(err) } else { compressSize = imgo.Load(SavePath + subPath + compressFilename).Filesize() } } // response data := gin.H{ "filename": formFile.Filename, "md5": fileMd5, "size": formFile.Size, "path": subPath + filename, "url": "http://" + ctx.Request.Host + "/assets/" + subPath + filename, } if fileType == "image" { data["compressSize"] = compressSize data["compressPath"] = subPath + compressFilename data["compressUrl"] = UrlPrefix + ctx.Request.Host + "/assets/" + subPath + compressFilename } return data, nil }