golang上传压缩图文件到七牛云碰到了问题?

通过字节数组方式上传文件到七牛云,直接把表单获取到的文件上传没有问题,但由于我有生成缩略图image.Image对象,需要上传它,我的方式是转成[]byte上传。

UploadQiniuImg是路由函数
upload_qiniu_img是七牛上传函数

现在碰到了问题,超过1M的上传后打开空白,小的文件没有问题。

有大佬告知一下吗?
image.png
以下是代码:


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
}
阅读 2.2k
2 个回答
buf := new(bytes.Buffer)
err := jpeg.Encode(buf, img, nil)
if err != nil {
    log.Println("failed to encode image:", err)
    return
}
imgBytes := buf.Bytes()

就是从两方面出发:1. 上传有问题 2. 压缩有问题
因为你说小文件上传没问题,证明其实上传的代码是对的,所以我更倾向于后者。

  1. debug 将压缩后的图片写成一个文件,看文件本身有无问题,注意压缩文件的格式 exif 信息是否正确
  2. 确认文件本身是否上传到云端,直接通过网页进入云端后台看桶里面有没有文件,有文件那么下载下来看文件本身是否正常
  3. 如果前两部分都正常,那再看云端访问是否有什么限制条件,比如大文件限制访问等。

PS:七牛本身不提供图片压缩的功能吗?讲道理,一般图床不都应该直接带有这个缩略图的功能吗,直接图片后面添加对应参数就可以访问到压缩图片或者不同尺寸的图片。(当然这可能会收你钱 ┓( ´∀` )┏ )

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题