基于 BeeGo 文件直传七牛云

简介

beego 是一个快速开发 Go 应用的 HTTP 框架,比较适合用来快速开发轻量小规模的 API、Web 及后端服务等应用。

七牛云是一个比较常用对象存储服务,附带 10G 的 CDN 流量,对个人用户中小企业相当友好。

本文就简单记录一下如何通过 BeeGo 直接将文件上传到七牛 CDN,并在上传时对图片类资源直接进行简单压缩。

依赖

BeeGo 之外的两个依赖包:

go get github.com/qiniu/api.v7
go get github.com/nfnt/resize

上代码

accessKey、secretKey 为七牛的调用 Key,从官网个人中心里找,bucket 为创建的对象存储名,domain 为对应的 CDN 域名且已设置好回源策略,具体过程可以参考官方教程。

为了加快上传和访问的速率和节省流量,同时进行一下图片类资源的压缩,下面是具体代码:

// Upload 通用文件上传
// @router /upload [post]
func (c *CmnFileController) Upload() {

    file, header, err := c.GetFile("file")
    var reader io.Reader = file
    var size = header.Size

    defer file.Close()

    if err != nil {
        c.Data["json"] = utils.NewResult(1, "上传失败", err)
        c.ServeJSON()
        return
    }

    // 取文件后缀
    suffix := "tmp"
    if header.Filename != "" && strings.Contains(header.Filename, ".") {
        suffix = header.Filename[strings.LastIndex(header.Filename, ".")+1:]
        suffix = strings.ToLower(suffix)
    }

    // 如果后缀为图片执行压缩操作
    if suffix == "jpg" || suffix == "png" {
        img, _, err := image.Decode(file)
        if err == nil {
            img = resize.Resize(0, 0, img, resize.Lanczos3)
            buf := new(bytes.Buffer)
            jpeg.Encode(buf, img, &jpeg.Options{Quality: 40})
            reader = buf
            size = int64(buf.Len())
        }
    }

    // 重名概率不高,直接用时间戳了
    key := fmt.Sprintf("%d.%s", time.Now().UnixNano(), suffix)
    putPolicy := storage.PutPolicy{
        Scope: fmt.Sprintf("%s:%s", bucket, key),
    }
    mac := qbox.NewMac(accessKey, secretKey)
    upToken := putPolicy.UploadToken(mac)

    cfg := storage.Config{}
    uploader := storage.NewFormUploader(&cfg)
    ret := storage.PutRet{}
    putExtra := storage.PutExtra{
        Params: map[string]string{
            "x:name": header.Filename,
        },
    }

    err = uploader.Put(context.Background(), &ret, upToken, key, reader, size, &putExtra)

    if err != nil {
        c.Data["json"] = utils.NewResult(1, "上传失败", err)
        c.ServeJSON()
        return
    }
    c.Data["json"] = utils.NewResult(0, "上传成功", map[string]string{
        "src": storage.MakePublicURL(domain, ret.Key),
    })
    c.ServeJSON()
}

附件

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注