上传流程

文件上传分为客户端上传(主要是指网页端和移动端等面向终端用户的场景)和服务端上传两种场景,具体可以参考文档业务流程。

服务端SDK在上传方面主要提供两种功能,一种是生成客户端上传所需要的上传凭证,另外一种是直接上传文件到云端。

客户端上传凭证

客户端(移动端或者Web端)上传文件的时候,需要从客户自己的业务服务器获取上传凭证,而这些上传凭证是通过服务端的SDK来生成的,然后通过客户自己的业务API分发给客户端使用。根据上传的业务需求不同,七牛云 Go SDK支持丰富的上传凭证生成方式。

拷贝
// 存储相关功能的引入包只有这两个,后面不再赘述
import (
github.com/qiniu/go-sdk/v7/auth/qbox
github.com/qiniu/go-sdk/v7/storage
)

accessKey := “your access key”
secretKey := “your secret key”
mac := qbox.NewMac(accessKey, secretKey)

简单上传的凭证

最简单的上传凭证只需要AccessKey,SecretKey和Bucket就可以。

拷贝
bucket:=“your bucket name”
putPolicy := storage.PutPolicy{
Scope: bucket,
}
mac := qbox.NewMac(accessKey, secretKey)
upToken := putPolicy.UploadToken(mac)

默认情况下,在不指定上传凭证的有效时间情况下,默认有效期为1个小时。也可以自行指定上传凭证的有效期,例如:

拷贝
//自定义凭证有效期(示例2小时,Expires 单位为秒,为上传凭证的有效时间)
bucket := “your bucket name”

putPolicy := storage.PutPolicy{
Scope: bucket,
}
putPolicy.Expires = 7200 //示例2小时有效期
mac := qbox.NewMac(accessKey, secretKey)
upToken := putPolicy.UploadToken(mac)

覆盖上传的凭证

覆盖上传除了需要简单上传所需要的信息之外,还需要想进行覆盖的文件名称,这个文件名称同时可是客户端上传代码中指定的文件名,两者必须一致。

拷贝
bucket := “your bucket name”

// 需要覆盖的文件名
keyToOverwrite := “qiniu.mp4”
putPolicy := storage.PutPolicy{
Scope: fmt.Sprintf(“%s:%s”, bucket, keyToOverwrite),
}
mac := qbox.NewMac(accessKey, secretKey)
upToken := putPolicy.UploadToken(mac)

自定义上传回复的凭证

默认情况下,文件上传到七牛之后,在没有设置returnBody或者回调相关的参数情况下,七牛返回给上传端的回复格式为hash和key,例如:

拷贝
{“hash”:“Ftgm-CkWePC9fzMBTRNmPMhGBcSV”,“key”:“qiniu.jpg”}

有时候我们希望能自定义这个返回的JSON格式的内容,可以通过设置returnBody参数来实现,在returnBody中,我们可以使用七牛支持的魔法变量和自定义变量。

拷贝
bucket := “your bucket name”

putPolicy := storage.PutPolicy{
Scope: bucket,
ReturnBody: {"key":"$(key)","hash":"$(etag)","fsize":$(fsize),"bucket":"$(bucket)","name":"$(x:name)"},
}
mac := qbox.NewMac(accessKey, secretKey)
upToken := putPolicy.UploadToken(mac)

则文件上传到七牛之后,收到的回复内容格式如下:

拷贝
{“key”:“github-x.png”,“hash”:“FqKXVdTvIx_mPjOYdjDyUSy_H1jr”,“fsize”:6091,“bucket”:“if-pbl”,“name”:“github logo”}

对于上面的自定义返回值,我们需要自定义结构体来解析这个回复,例如下面提供了一个解析结果的方法:

拷贝
// 自定义返回值结构体
type MyPutRet struct {
Key string
Hash string
Fsize int
Bucket string
Name string
}

localFile := “your local file path”
bucket := “your bucket name”
key := “your file save key”

// 使用 returnBody 自定义回复格式
putPolicy := storage.PutPolicy{
Scope: bucket,
ReturnBody: {"key":"$(key)","hash":"$(etag)","fsize":$(fsize),"bucket":"$(bucket)","name":"$(x:name)"},
}
mac := qbox.NewMac(accessKey, secretKey)
upToken := putPolicy.UploadToken(mac)

cfg := storage.Config{}
formUploader := storage.NewFormUploader(&cfg)
ret := MyPutRet{}
putExtra := storage.PutExtra{
Params: map[string]string{
“x:name”: “github logo”,
},
}
err := formUploader.PutFile(context.Background(), &ret, upToken, key, localFile, &putExtra)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(ret.Bucket, ret.Key, ret.Fsize, ret.Hash, ret.Name)