执行命令:
go get github.com/qiniu/go-sdk/v7
Go SDK 的所有的功能,都需要合法的授权。授权凭证的签算需要七牛账号下的一对有效的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
存到数据库了。
具体解读:
baseController
,继承自 web.Controller
,并包含一个字段 o
,用于处理数据库操作。Prepare
方法:这个方法是 baseController
的成员方法,用于初始化数据库操作器 o
,确保每次请求都可以使用。它在每次请求到来时都会被调用。Upload
方法:这是代码的核心部分,用于处理文件上传。它接收三个参数:file
是上传的文件的 multipart.File
,header
是上传文件的头部信息 multipart.FileHeader
,err
是上传过程中的错误信息。
file
转换为 io.Reader
,并获取上传文件的大小。defer
关键字确保在函数返回前关闭文件。err
,如果有错误,返回空字符串。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
}
当然go的其他框架也能用这个函数,可能或有些许的修改,注意Upload
函数需要传三个参数~