文章目录
- 安装
- 获取凭证
- 配置`app.conf`
- 上代码
- 调用示例
- ps
安装
执行命令:
go get github.com/qiniu/go-sdk/v7
获取凭证
Go SDK 的所有的功能,都需要合法的授权。授权凭证的签算需要七牛账号下的一对有效的Access Key
和Secret Key
,这对密钥可以通过如下步骤获得:
- 点击注册🔗开通七牛开发者帐号
- 如果已有账号,直接登录七牛开发者后台,点击这里🔗查看 Access Key 和 Secret Key
配置app.conf
首先咱们在app.conf
里配置好凭证等信息:
SecretKey = your secretkey
AccessKey = your accesskey
Bucket = your bucket
Domain = your domain
上代码
我将上传文件的代码封装在了函数Upload
里:
package controllers
import (
"context"
"fmt"
"github.com/beego/beego/v2/client/orm"
"github.com/beego/beego/v2/server/web"
"github.com/qiniu/go-sdk/v7/auth/qbox"
"github.com/qiniu/go-sdk/v7/storage"
"io"
"mime/multipart"
"strings"
"time"
)
type baseController struct {
web.Controller
o orm.Ormer
}
func (c *baseController) Prepare() {
c.o = orm.NewOrm()
}
//这里才是核心代码
func (c *baseController) Upload(file multipart.File, header *multipart.FileHeader, err error) string {
var reader io.Reader = file
var size = header.Size
defer file.Close()
if err != nil {
return ""
}
// 取文件后缀
suffix := ""
if header.Filename != "" && strings.Contains(header.Filename, ".") {
suffix = header.Filename[strings.LastIndex(header.Filename, ".")+1:]
suffix = strings.ToLower(suffix)
}
//获取配置
secretKey, _ := web.AppConfig.String("SecretKey")
accessKey, _ := web.AppConfig.String("AccessKey")
bucket, _ := web.AppConfig.String("Bucket")
domain, _ := web.AppConfig.String("Domain")
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 {
return ""
}
return fmt.Sprintf("%s/%s", domain, ret.Key)
}
这个函数会直接返回上传文件的外链访问地址,例如:http://rz2n87yck.hn-bkt.clouddn.com/avatar.jpg,这样就可以将这个url
存到数据库了。
具体解读:
- 类型定义和导入:首先,代码导入了一些必要的包,包括 Beego、七牛云 SDK,以及一些标准库。然后,定义了一个类型
baseController
,继承自web.Controller
,并包含一个字段o
,用于处理数据库操作。 Prepare
方法:这个方法是baseController
的成员方法,用于初始化数据库操作器o
,确保每次请求都可以使用。它在每次请求到来时都会被调用。Upload
方法:这是代码的核心部分,用于处理文件上传。它接收三个参数:file
是上传的文件的multipart.File
,header
是上传文件的头部信息multipart.FileHeader
,err
是上传过程中的错误信息。- 首先,将
file
转换为io.Reader
,并获取上传文件的大小。 - 使用
defer
关键字确保在函数返回前关闭文件。 - 检查
err
,如果有错误,返回空字符串。 - 提取文件后缀:从上传文件的名字中获取文件后缀名,用于构建存储在七牛云上的文件名。
- 首先,将
- 获取配置信息:从 Beego 的应用配置中获取七牛云存储所需的配置信息,包括
SecretKey
、AccessKey
、Bucket
、Domain
。 - 生成存储的文件名和上传凭证:根据当前时间戳和文件后缀生成存储在七牛云上的唯一文件名。然后,创建一个
storage.PutPolicy
,指定了上传的范围(Scope
),包括存储桶名和文件名。 - 生成上传凭证:使用七牛云的
qbox
包中的NewMac
方法创建一个认证对象mac
,然后使用PutPolicy
的UploadToken
方法生成上传凭证upToken
。 - 初始化上传配置和上传对象:创建
storage.Config
对象和storage.FormUploader
对象,用于实际执行上传操作。 - 执行文件上传:调用
uploader.Put
方法执行文件上传操作。这里传递了上传所需的参数,包括上面生成的upToken
、文件名key
、文件内容的reader
、文件大小size
,以及一个storage.PutExtra
对象,其中可以包含额外的参数。上传成功后,会得到一个storage.PutRet
对象。 - 返回上传后的文件链接:如果上传成功,使用上传后的文件名构建完整的文件链接,然后返回。
调用示例
package controllers
import (
"ByteRhythm/models"
"ByteRhythm/utils"
)
type VideoController struct {
baseController
}
// Publish 发布视频
func (c *VideoController) Publish() {
if url := c.Upload(c.GetFile("data")); url == "" {
c.Data["json"] = map[string]interface{}{
"status_code": 1,
"status_msg": "发布失败",
}
c.ServeJSON()
return
}
ps
当然go的其他框架也能用这个函数,可能或有些许的修改,注意Upload
函数需要传三个参数~