You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

133 lines
2.7 KiB

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
}