前言
青训营抖音项目需要存储视频和封面等文件,经过讨论后选择了七牛云对象存储,记录整合过程。
准备工作
- 注册七牛云账号,七牛云
- 开通对象存储kodo
- 在空间管理处新建空间,选择私有
- 进入空间可以看到临时域名,这是下载文件时使用的,上传不使用
引入依赖
使用go get github.com/qiniu/go-sdk/v7引入依赖
获取accessKey, secretKey,可进入七牛云控制台-密钥管理查看
上传
在本次项目中使用服务端直传,相关代码如下,包含注释:
func UploadData(key string, data []byte) {
putPolicy := storage.PutPolicy{
Scope: config.QiniuBucket,// 你的空间名称
}
mac := qbox.NewMac(config.QiniuAccessKey, config.QiniuSecretKey)
upToken := putPolicy.UploadToken(mac)
cfg := storage.Config{}
// 空间对应的机房
cfg.Zone = &storage.ZoneHuadong
// 是否使用https域名
cfg.UseHTTPS = false
// 上传是否使用CDN上传加速
cfg.UseCdnDomains = false
bucketManager := storage.NewBucketManager(mac, &cfg)
fileInfo, sErr := bucketManager.Stat(config.QiniuBucket, key)
if sErr == nil && fileInfo.Fsize != 0 {
// 当文件在云端存在则不上传
return
}
formUploader := storage.NewFormUploader(&cfg)
ret := storage.PutRet{}
putExtra := storage.PutExtra{}
dataLen := int64(len(data))
err := formUploader.Put(context.Background(), &ret, upToken, key, bytes.NewReader(data), dataLen, &putExtra)
if err != nil {
fmt.Println(err)
return
}
}
其中关于Zone对象和机房的关系如下:
| 机房 | Zone对象 |
|---|---|
| 华东 | storage.ZoneHuadong |
| 华北 | storage.ZoneHuabei |
| 华南 | storage.ZoneHuanan |
| 北美 | storage.ZoneBeimei |
| 新加坡 | storage.ZoneXinjiapo |
下载
我们使用的是私人空间,需要创建私有链接
func GetDownloadUrl(key string) string {
ru := redisutil.NewRedisUtil(redis_pool_config) // 不是必需
var url string
hit, err := ru.Get(context.Background(), key, &url)
if err != nil {
log.Fatal(err)
}
if hit {
return url
}
mac := qbox.NewMac(config.QiniuAccessKey, config.QiniuSecretKey)
domain := config.QiniuDomian
deadline := time.Now().Add(time.Second * config.QiniuUrlExpire).Unix() //1小时有效期
privateAccessURL := storage.MakePrivateURL(mac, domain, key, deadline)
// 缓存url,避免频繁创建
go ru.Set(context.Background(), key, privateAccessURL, config.QiniuUrlExpire-config.RedisUrlExpireDiff)
return privateAccessURL
}