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