资源管理
资源管理包括的主要功能有:
- 获取文件信息
- 修改文件MimeType
- 修改文件存储类型
- 移动或重命名文件
- 复制文件副本
- 删除空间中的文件
- 设置或更新文件生存时间
- 获取指定前缀文件列表
- 抓取网络资源到空间
- 更新镜像存储空间中文件内容
- 资源管理批量操作
- 批量获取文件信息
- 批量修改文件类型
- 批量删除文件
- 批量复制文件
- 批量移动或重命名文件
- 批量更新文件的有效期
- 批量更新文件存储类型
资源管理相关的操作首先要构建
BucketManager
对象:
mac := qbox.NewMac(accessKey, secretKey)
cfg := storage.Config{
// 是否使用https域名进行资源管理
UseHTTPS: false,
}
// 指定空间所在的区域,如果不指定将自动探测
// 如果没有特殊需求,默认不需要指定
//cfg.Zone=&storage.ZoneHuabei
bucketManager := storage.NewBucketManager(mac, &cfg)
获取文件信息
bucket := "if-pbl"
key := "github.png"
fileInfo, sErr := bucketManager.Stat(bucket, key)
if sErr != nil {
fmt.Println(sErr)
return
}
fmt.Println(fileInfo.String())
//可以解析文件的PutTime
fmt.Println(storage.ParsePutTime(fileInfo.PutTime))
修改文件MimeType
bucket := "if-pbl"
key := "github.png"
newMime := "image/x-png"
err := bucketManager.ChangeMime(bucket, key, newMime)
if err != nil {
fmt.Println(err)
return
}
修改文件存储类型
bucket := "if-pbl"
key := "github.png"
fileType := 1
err := bucketManager.ChangeType(bucket, key, fileType)
if err != nil {
fmt.Println(err)
return
}
移动或重命名文件
移动操作本身支持移动文件到相同,不同空间中,在移动的同时也可以支持文件重命名。唯一的限制条件是,移动的源空间和目标空间必须在同一个机房。
源空间 | 目标空间 | 源文件名 | 目标文件名 | 描述 |
---|---|---|---|---|
BucketA | BucketA | KeyA | KeyB | 相当于同空间文件重命名 |
BucketA | BucketB | KeyA | KeyA | 移动文件到BucketB,文件名一致 |
BucketA | BucketB | KeyA | KeyB | 移动文件到BucketB,文件名变成KeyB |
move
操作支持强制覆盖选项,即如果目标文件已存在,可以设置强制覆盖选项force
来覆盖那个文件的内容。
srcBucket := "if-pbl"
srcKey := "github.png"
//目标空间可以和源空间相同,但是不能为跨机房的空间
destBucket := srcBucket
//目标文件名可以和源文件名相同,也可以不同
destKey := "github-new.png"
//如果目标文件存在,是否强制覆盖,如果不覆盖,默认返回614 file exists
force := false
err := bucketManager.Move(srcBucket, srcKey, destBucket, destKey, force)
if err != nil {
fmt.Println(err)
return
}
复制文件副本
文件的复制和文件移动其实操作一样,主要的区别是移动后源文件不存在了,而复制的结果是源文件还存在,只是多了一个新的文件副本。
srcBucket := "if-pbl"
srcKey := "github.png"
//目标空间可以和源空间相同,但是不能为跨机房的空间
destBucket := srcBucket
//目标文件名可以和源文件名相同,也可以不同
destKey := "github-new.png"
//如果目标文件存在,是否强制覆盖,如果不覆盖,默认返回614 file exists
force := false
err := bucketManager.Copy(srcBucket, srcKey, destBucket, destKey, force)
if err != nil {
fmt.Println(err)
return
}
删除空间中的文件
bucket := "if-pbl"
key := "github.png"
err := bucketManager.Delete(bucket, key)
if err != nil {
fmt.Println(err)
return
}
设置或更新文件的生存时间
可以给已经存在于空间中的文件设置文件生存时间,或者更新已设置了生存时间但尚未被删除的文件的新的生存时间。
bucket := "if-pbl"
key := "github.png"
days := 7
err := bucketManager.DeleteAfterDays(bucket, key, days)
if err != nil {
fmt.Println(err)
return
}
获取指定前缀的文件列表
获取指定文件前缀的列表用来从空间列举文件,每次最大的列举数量为1000,如果需要列举超过1000的文件数量,可以根据每次函数调用返回的nextMarker
进行循环列举。
bucket := "if-bc"
limit := 1000
prefix := "qshell/"
delimiter := ""
//初始列举marker为空
marker := ""
for {
entries, _, nextMarker, hashNext, err := bucketManager.ListFiles(bucket, prefix, delimiter, marker, limit)
if err != nil {
fmt.Println("list error,", err)
break
}
//print entries
for _, entry := range entries {
fmt.Println(entry.Key)
}
if hashNext {
marker = nextMarker
} else {
//list end
break
}
}
抓取网络资源到空间
bucket := "if-bc"
resURL := "http://devtools.qiniu.com/qiniu.png"
// 指定保存的key
fetchRet, err := bucketManager.Fetch(resURL, bucket, "qiniu.png")
if err != nil {
fmt.Println("fetch error,", err)
} else {
fmt.Println(fetchRet.String())
}
// 不指定保存的key,默认用文件hash作为文件名
fetchRet, err = bucketManager.FetchWithoutKey(resURL, bucket)
if err != nil {
fmt.Println("fetch error,", err)
} else {
fmt.Println(fetchRet.String())
}
更新镜像空间中存储的文件内容
bucket := "if-bc"
key := "qiniu.png"
err := bucketManager.Prefetch(bucket, key)
if err != nil {
fmt.Println("fetch error,", err)
}
资源管理批量操作
批量获取文件信息
//每个batch的操作数量不可以超过1000个,如果总数量超过1000,需要分批发送
bucket := "if-pbl"
keys := []string{
"github1.png",
"github2.png",
"github3.png",
"github4.png",
"github5.png",
}
statOps := make([]string, 0, len(keys))
for _, key := range keys {
statOps = append(statOps, storage.URIStat(bucket, key))
}
rets, err := bucketManager.Batch(statOps)
if err != nil {
// 遇到错误
if _, ok := err.(*rpc.ErrorInfo); ok {
for _, ret := range rets {
// 200 为成功
fmt.Printf("%d\n", ret.Code)
if ret.Code != 200 {
fmt.Printf("%s\n", ret.Data.Error)
} else {
fmt.Printf("%v\n", ret.Data)
}
}
} else {
fmt.Printf("batch error, %s", err)
}
} else {
// 完全成功
for _, ret := range rets {
// 200 为成功
fmt.Printf("%d\n", ret.Code)
fmt.Printf("%v\n", ret.Data)
}
}
批量修改文件类型
//每个batch的操作数量不可以超过1000个,如果总数量超过1000,需要分批发送
bucket := "if-pbl"
chgmKeys := map[string]string{
"github1.png": "image/x-png",
"github2.png": "image/x-png",
"github3.png": "image/x-png",
"github4.png": "image/x-png",
"github5.png": "image/x-png",
}
chgmOps := make([]string, 0, len(chgmKeys))
for key, newMime := range chgmKeys {
chgmOps = append(chgmOps, storage.URIChangeMime(bucket, key, newMime))
}
rets, err := bucketManager.Batch(chgmOps)
if err != nil {
// 遇到错误
if _, ok := err.(*rpc.ErrorInfo); ok {
for _, ret := range rets {
// 200 为成功
fmt.Printf("%d\n", ret.Code)
if ret.Code != 200 {
fmt.Printf("%s\n", ret.Data.Error)
}
}
} else {
fmt.Printf("batch error, %s", err)
}
} else {
// 完全成功
for _, ret := range rets {
// 200 为成功
fmt.Printf("%d\n", ret.Code)
if ret.Code != 200 {
fmt.Printf("%s\n", ret.Data.Error)
}
}
}
批量删除文件
//每个batch的操作数量不可以超过1000个,如果总数量超过1000,需要分批发送
bucket := "if-pbl"
keys := []string{
"github1.png",
"github2.png",
"github3.png",
"github4.png",
"github5.png",
}
deleteOps := make([]string, 0, len(keys))
for _, key := range keys {
deleteOps = append(deleteOps, storage.URIDelete(bucket, key))
}
rets, err := bucketManager.Batch(deleteOps)
if err != nil {
// 遇到错误
if _, ok := err.(*rpc.ErrorInfo); ok {
for _, ret := range rets {
// 200 为成功
fmt.Printf("%d\n", ret.Code)
if ret.Code != 200 {
fmt.Printf("%s\n", ret.Data.Error)
}
}
} else {
fmt.Printf("batch error, %s", err)
}
} else {
// 完全成功
for _, ret := range rets {
// 200 为成功
fmt.Printf("%d\n", ret.Code)
}
}
批量复制文件
srcBucket := "if-pbl"
destBucket := "if-pbl"
force := true
copyKeys := map[string]string{
"github1.png": "github1-copy.png",
"github2.png": "github2-copy.png",
"github3.png": "github3-copy.png",
"github4.png": "github4-copy.png",
"github5.png": "github5-copy.png",
}
copyOps := make([]string, 0, len(copyKeys))
for srcKey, destKey := range copyKeys {
copyOps = append(copyOps, storage.URICopy(srcBucket, srcKey, destBucket, destKey, force))
}
rets, err := bucketManager.Batch(copyOps)
if err != nil {
// 遇到错误
if _, ok := err.(*rpc.ErrorInfo); ok {
for _, ret := range rets {
// 200 为成功
fmt.Printf("%d\n", ret.Code)
if ret.Code != 200 {
fmt.Printf("%s\n", ret.Data.Error)
}
}
} else {
fmt.Printf("batch error, %s", err)
}
} else {
// 完全成功
for _, ret := range rets {
// 200 为成功
fmt.Printf("%d\n", ret.Code)
fmt.Printf("%v\n", ret.Data)
}
}
批量移动或重命名文件
srcBucket := "if-pbl"
destBucket := "if-pbl"
force := true
moveKeys := map[string]string{
"github1.png": "github1-move.png",
"github2.png": "github2-move.png",
"github3.png": "github3-move.png",
"github4.png": "github4-move.png",
"github5.png": "github5-move.png",
}
moveOps := make([]string, 0, len(moveKeys))
for srcKey, destKey := range moveKeys {
moveOps = append(moveOps, storage.URIMove(srcBucket, srcKey, destBucket, destKey, force))
}
rets, err := bucketManager.Batch(moveOps)
if err != nil {
// 遇到错误
if _, ok := err.(*rpc.ErrorInfo); ok {
for _, ret := range rets {
// 200 为成功
fmt.Printf("%d\n", ret.Code)
if ret.Code != 200 {
fmt.Printf("%s\n", ret.Data.Error)
}
}
} else {
fmt.Printf("batch error, %s", err)
}
} else {
// 完全成功
for _, ret := range rets {
// 200 为成功
fmt.Printf("%d\n", ret.Code)
fmt.Printf("%v\n", ret.Data)
}
}
批量更新文件的有效期
//每个batch的操作数量不可以超过1000个,如果总数量超过1000,需要分批发送
bucket := "if-bc"
expireKeys := map[string]int{
"github1.png": 7,
"github2.png": 8,
"github3.png": 9,
"github4.png": 10,
"github5.png": 11,
}
expireOps := make([]string, 0, len(expireKeys))
for key, expire := range expireKeys {
expireOps = append(expireOps, storage.URIDeleteAfterDays(bucket, key, expire))
}
rets, err := bucketManager.Batch(expireOps)
if err != nil {
// 遇到错误
if _, ok := err.(*rpc.ErrorInfo); ok {
for _, ret := range rets {
// 200 为成功
fmt.Printf("%d\n", ret.Code)
if ret.Code != 200 {
fmt.Printf("%s\n", ret.Data.Error)
}
}
} else {
fmt.Printf("batch error, %s", err)
}
} else {
// 完全成功
for _, ret := range rets {
// 200 为成功
fmt.Printf("%d\n", ret.Code)
if ret.Code != 200 {
fmt.Printf("%s\n", ret.Data.Error)
}
}
}
批量更新文件存储类型
//每个batch的操作数量不可以超过1000个,如果总数量超过1000,需要分批发送
bucket := "if-pbl"
chtypeKeys := map[string]int{
"github1.png": 1,
"github2.png": 1,
"github3.png": 1,
"github4.png": 1,
"github5.png": 1,
}
chtypeOps := make([]string, 0, len(chtypeKeys))
for key, fileType := range chtypeKeys {
chtypeOps = append(chtypeOps, storage.URIChangeType(bucket, key, fileType))
}
rets, err := bucketManager.Batch(chtypeOps)
if err != nil {
// 遇到错误
if _, ok := err.(*rpc.ErrorInfo); ok {
for _, ret := range rets {
// 200 为成功
fmt.Printf("%d\n", ret.Code)
if ret.Code != 200 {
fmt.Printf("%s\n", ret.Data.Error)
}
}
} else {
fmt.Printf("batch error, %s", err)
}
} else {
// 完全成功
for _, ret := range rets {
// 200 为成功
fmt.Printf("%d\n", ret.Code)
if ret.Code != 200 {
fmt.Printf("%s\n", ret.Data.Error)
}
}
}