安装
执行命令:
1
| go get github.com/qiniu/go-sdk/v7
|
获取凭证
Go SDK 的所有的功能,都需要合法的授权。授权凭证的签算需要七牛账号下的一对有效的Access Key
和Secret Key
,这对密钥可以通过如下步骤获得:
- 点击注册🔗开通七牛开发者帐号
- 如果已有账号,直接登录七牛开发者后台,点击这里🔗查看 Access Key 和 Secret Key
配置app.conf
首先咱们在app.conf
里配置好凭证等信息:
1 2 3 4
| SecretKey = your secretkey AccessKey = your accesskey Bucket = your bucket Domain = your domain
|
上代码
我将上传文件的代码封装在了函数Upload
里:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
| 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
对象。
- 返回上传后的文件链接:如果上传成功,使用上传后的文件名构建完整的文件链接,然后返回。
调用示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| package controllers
import ( "ByteRhythm/models" "ByteRhythm/utils" )
type VideoController struct { baseController }
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
函数需要传三个参数~