Golang整合七牛云完成简单上传下载 | 青训营笔记

576 阅读1分钟

前言

青训营抖音项目需要存储视频和封面等文件,经过讨论后选择了七牛云对象存储,记录整合过程。

准备工作

  • 注册七牛云账号,七牛云
  • 开通对象存储kodo

image.png

  • 在空间管理处新建空间,选择私有

image.png

  • 进入空间可以看到临时域名,这是下载文件时使用的,上传不使用

image.png

引入依赖

使用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
}