在我的 Go 程序中,我正在将一个多 GB 的文件上传到 Google Cloud Storage (GCS)。我在这里使用客户端库:https://pkg.go.dev/cloud.google.com/go/storage
我的代码与文档中的示例类似。
r
是一个文件阅读器:
client, err := storage.NewClient(ctx)
if err != nil {
return err
}
defer client.Close()
w := client.Bucket(l.Bucket).Object(fileName).NewWriter(ctx)
w.ContentType = ""
w.ACL = []storage.ACLRule{{Entity: storage.AllUsers, Role: storage.RoleReader}}
if _, err := io.Copy(w, r); err != nil {
return err // ########## Error is returned on this line! ##########
}
if err := w.Close(); err != nil {
return err
}
小文件成功。但是,对于需要一个多小时才能上传的大文件,我的笔记本电脑会在上传完成之前进入睡眠状态。当我的笔记本电脑唤醒时,连接中断并返回以下错误(出于隐私考虑,我删除了 IP 地址):
read tcp x.x.x.x:ppp->X.X.X.X:PPP: read: connection reset by peer
相反,我想恢复上传。从 GCS 文档中,我看到支持断点续传 (https://cloud.google.com/storage/docs/resumable-uploads),但我不确定如何从 Go 客户端使用此功能。
最后一个重要细节:我不想从头开始重试上传。我想继续并保留中断之前的进度。