通过字节数组方式上传文件到七牛云,直接把表单获取到的文件上传没有问题,但由于我有生成缩略图image.Image对象,需要上传它,我的方式是转成[]byte上传。
UploadQiniuImg是路由函数
upload_qiniu_img是七牛上传函数
现在碰到了问题,超过1M的上传后打开空白,小的文件没有问题。
有大佬告知一下吗?
以下是代码:
package api
import (
"bytes"
"context"
"fmt"
"go-love/pkg/app"
"go-love/pkg/e"
"go-love/pkg/logging"
"go-love/pkg/upload"
"io/ioutil"
"mime/multipart"
"net/http"
"github.com/gin-gonic/gin"
"github.com/qiniu/go-sdk/v7/auth/qbox"
"github.com/qiniu/go-sdk/v7/storage"
)
const (
accessKey = "***"
serectKey = "***"
bucket = "***"
host = "***"
)
// @Tags 通用模块
// @Summary Import Image
// @Produce json
// @Param image formData file true "Image File"
// @Param type formData string true "上传类型:avatar-头像 "
// @Success 200 {object} app.Response
// @Failure 500 {object} app.Response
// @Router /api/v1/upload_qiniu [post]
// @Security ApiKeyAuth
func UploadQiniuImg(c *gin.Context) {
//从请求当中判断方法
appG := app.Gin{C: c}
file, image, err := c.Request.FormFile("file")
uploadType := c.PostForm("type")
if err != nil {
logging.Warn(err)
appG.FailJson(e.ERROR)
return
}
if image == nil {
appG.FailJson(e.INVALID_PARAMS)
return
}
imageName := upload.GetImageName(image.Filename)
fullPath := upload.GetImageFullPath() + uploadType + "/"
// savePath := upload.GetImagePath() + uploadType + "/"
// src := fullPath + imageName
size := upload.GetFileSize(file)
if !upload.CheckImageExt(imageName) || !upload.CheckImageSize(file) {
appG.FailJson(e.ERROR_UPLOAD_CHECK_FORMAT)
return
}
err = upload.CheckFile(fullPath)
if err != nil {
logging.Warn(err)
appG.FailJson(e.ERROR_UPLOAD_CHECK_FAIL)
return
}
//上传头像时,进行中心等比裁剪为400*400
var byteData []byte
if uploadType == "avatar" {
fmt.Println("准备缩放裁剪头像")
fileContent, _ := image.Open()
content, err := ioutil.ReadAll(fileContent)
if err != nil {
fmt.Println("文件读取失败")
}
// 生成缩略图
thumbimg := upload.CreateThumbImg(content)
// image转byte
byteData, err = upload.ImageToByte(thumbimg, imageName)
} else {
// FileHeader转byte
content, _ := image.Open()
byteData, err = ioutil.ReadAll(content)
if err != nil {
fmt.Println("文件读取失败")
}
}
// url, err := upload_qiniu_img(uploadType, imageName, *image)
url, err := upload_qiniu_img(uploadType, imageName, byteData)
if err != nil {
logging.Warn(err)
appG.FailJson(e.ERROR)
return
}
appG.Response(http.StatusOK, e.SUCCESS, map[string]string{
"fileSize": size,
"fileUrl": url,
"fileName": imageName,
})
}
func upload_qiniu_img(uploadType string, imageName string, byteData []byte) (string, error) {
key := "imgs/" + uploadType + "/" + imageName
fmt.Println("upload: ", imageName)
putPolicy := storage.PutPolicy{
Scope: fmt.Sprintf("%s:%s", bucket, key),
}
mac := qbox.NewMac(accessKey, serectKey)
upToken := putPolicy.UploadToken(mac)
cfg := storage.Config{}
// 空间对应的机房
cfg.Zone = &storage.ZoneHuanan
// 是否使用https域名
cfg.UseHTTPS = false
// 上传是否使用CDN上传加速
cfg.UseCdnDomains = false
formUploader := storage.NewFormUploader(&cfg)
ret := storage.PutRet{}
putExtra := storage.PutExtra{}
datalen := int64(len(byteData))
err := formUploader.Put(context.Background(), &ret, upToken, key, bytes.NewReader(byteData), datalen, &putExtra)
if err != nil {
fmt.Println(err)
return "", err
}
return host + "/" + ret.Key, nil
}
go-love/pkg/upload
func CreateThumbImg(imgData []byte) image.Image {
buf := bytes.NewBuffer(imgData)
image, err := imaging.Decode(buf)
if err != nil {
fmt.Println(err)
fmt.Println("生成缩略图失败")
return nil
}
//生成缩略图,尺寸150*150
image = imaging.Resize(image, 500, 500, imaging.Lanczos)
return image
}
func ImageToByte(img image.Image, imageName string) ([]byte, error) {
split := strings.Split(imageName, ".")
suffix := split[len(split)-1]
suffix = strings.ToLower(suffix)
buf := new(bytes.Buffer)
switch suffix {
case "jpg", "jpeg":
if err := jpeg.Encode(buf, img, nil); err != nil {
return nil, err
}
case "png":
if err := png.Encode(buf, img); err != nil {
return nil, err
}
default:
return nil, errors.New("不支持")
}
return buf.Bytes(), nil
}