安装
执行命令:
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函数需要传三个参数~