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
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
|
|
}
|