如何解决使用 GO SDK
我正在尝试将目录上传和下载到包含大量数据的 GCS。有人可以指出我如何使用 Golang SDK 实现这一点。我也想做分段上传(-m)
示例目录结构:
$ tree dir1/
dir1/
└── dir2
└── dir3
├── 1.csv
└── 2.csv
等效的 GSUtil 命令:gustil -m cp -r dir1 gs://exmaple/
解决方法
据我所知,我认为 GCP 存储 API 是原子的,一次只允许上传一个对象。
gsutil 命令使用递归遍历提供的路径,但最终会调用单个 API 进行上传。
下面的代码片段会给你一些提示,请不要我没有测试实际复制到 GCP。我只验证了代码可以编译。
这是 Google 在其文档中的修改版本 Uploading Objects
package main
import (
"context"
"fmt"
"io"
"os"
"path/filepath"
"strings"
"time"
"cloud.google.com/go/storage"
)
// BulkUpload uploads files in bulk
func BulkUpload(bucket,rootPath string) error {
ctx := context.Background()
client,err := storage.NewClient(ctx)
if err != nil {
return fmt.Errorf("storage.NewClient: %v",err)
}
defer client.Close()
fileList,objPath,err := pathWalk(rootPath)
if err != nil {
return err
}
_ = objPath
for i:=0; i <len(fileList);i++ {
// Open and read local file
f,err := os.Open(fileList[i])
if err != nil {
return fmt.Errorf("os.Open: %v",err)
}
f.Close()
ctx,cancel := context.WithTimeout(ctx,time.Second*50)
defer cancel()
// Upload an object with storage.Writer.
wc := client.Bucket(bucket).Object(objPath[i]).NewWriter(ctx)
if _,err = io.Copy(wc,f); err != nil {
return fmt.Errorf("io.Copy: %v",err)
}
if err := wc.Close(); err != nil {
return fmt.Errorf("Writer.Close: %v",err)
}
fmt.Printf("Blob %v uploaded.\n",objPath[i])
}
return nil
}
// pathWalk create a list of files from a root path
// returns a list of all files and a list of files excluding the root path
func pathWalk(root string) ([]string,[]string,error){
var files []string
var objectPath []string
err := filepath.Walk(root,func(path string,info os.FileInfo,err error) error {
files = append(files,path)
return nil
})
if err != nil {
return nil,nil,fmt.Errorf("error walking path: %v",err)
}
for _,f := range files {
objectPath = append(objectPath,strings.Trim(f,root))
}
return files,objectPath,nil
}
func main() {
if err := BulkUpload("mybucket","somedirectory/" ); err != nil {
panic(err)
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。