1 amazon-s3 go amazon-web-services google-cloud-storage aws-sdk-go
我们目前正在从 Google 存储过渡到 Amazon S3 存储。
在 Google Storage 上,我使用此函数https://godoc.org/cloud.google.com/go/storage#Writer.Write来写入文件。它基本上使用 io.Writer 接口将数据字节流式传输到文件中,并在 writer 上调用 Close() 时保存文件。这使我们能够全天将数据流式传输到文件中,并在一天结束时完成它,而无需创建文件的本地副本。
我检查了 godoc 上的 aws-sdk-go s3 文档,似乎找不到类似的函数,该函数允许我们将数据流式传输到文件,而无需先在本地创建文件。我发现的只是从现有本地文件(如 PutObject())传输数据的函数。
所以我的问题是:有没有一种方法可以使用 aws-sdk-go 将数据流式传输到 amazon s3 文件,类似于 google storage Write() 方法?
S3 HTTP API 没有任何append
类似的 write 方法,而是使用分段上传。您基本上上传带有索引号的固定大小的块,S3 会将它们内部存储为单独的文件,并在收到最后一个块时自动连接它们。默认块大小为 5MB(可以更改),最多可以有 10,000 个块(无法更改)。
不幸的是,API 似乎没有aws-sdk-go
提供任何方便的接口来使用块来实现流行为。
您必须直接使用CreateMultipartUploadparts
手动处理块(在中调用aws-sdk-go
)来初始化传输,为要发送的数据创建UploadPartInput实例并使用UploadPart发送它。发送最后一个块后,您需要使用CompleteMultipartUpload关闭事务。
关于如何直接从例如[]byte
数据而不是文件进行流式传输的问题:UploadPartInputBody
结构的字段是放置要发送到 S3 的内容的位置,请注意其类型为。这意味着您可以使用bytes.NewReader([]byte)之类的内容创建一个内容,并将其设置为该值。Body
io.readseeker
io.readseeker
[]byte
UploadPartInput.Body
上传的 s3manager上传实用程序可能是了解如何使用多部分函数的一个很好的起点,它使用多部分 API 将单个大文件作为较小的块同时上传。
请记住,您应该设置一个生命周期策略来删除未完成的分段上传。如果您不发送最终的内容,CompleteMultipartUpload
所有已上传的块将保留在 S3 中并产生费用。可以通过 AWS 控制台/CLI 或使用aws-sdk-go
.
归档时间: |
|
查看次数: |
5187 次 |
最近记录: |