1

我们目前正在从 Google 存储过渡到 Amazon S3 存储。

在 Google Storage 上,我使用此功能https://godoc.org/cloud.google.com/go/storage#Writer.Write写入文件。它基本上使用 io.Writer 接口将数据字节流式传输到文件中,并在编写器上调用 Close() 时保存文件。这使我们可以整天将数据流式传输到文件中,并在一天结束时完成它,而无需创建文件的本地副本。

我检查了 godoc 上的 aws-sdk-go s3 文档,似乎找不到一个类似的函数,它允许我们将数据流式传输到文件而无需先在本地创建文件。我发现的只是从已经存在的本地文件(如 PutObject())流式传输数据的函数。

所以我的问题是:有没有一种方法可以使用类似于谷歌存储 Write() 方法的 aws-sdk-go 将数据流式传输到亚马逊 s3 文件?

4

1 回答 1

4

S3 HTTP API 没有任何append类似于 write 的方法,而是使用multipart uploads。您基本上上传具有索引号的固定大小的块,S3 会将它们作为单独的文件在内部存储,并在收到最后一个块时自动连接它们。默认块大小为 5MB(可以更改),您最多可以拥有 10,000 个块(无法更改)。

不幸的是,API 似乎没有aws-sdk-go提供任何方便的接口来使用块来实现流式传输行为。

您必须直接使用CreateMultipartUploadparts手动(调用)处理块来初始化传输,为要发送的数据创建UploadPartInput实例并使用UploadPart发送它。发送最后一个块后,您需要使用CompleteMultipartUpload关闭事务。aws-sdk-go

关于如何直接从例如[]byte数据而不是文件进行流式传输的问题:UploadPartInputBody结构的字段是您放置要发送到 S3 的内容的位置,请注意它的类型为. 这意味着您可以使用诸如bytes.NewReader([]byte) 之类的内容创建一个from 例如您的内容并设置为该内容。Bodyio.readseekerio.readseeker[]byteUploadPartInput.Body

上传的s3manager上传实用程序可能是了解如何使用多部分功能的一个很好的起点,它使用多部分 API 将单个大文件作为较小的块同时上传。

请记住,您应该设置一个生命周期策略来删除未完成的分段上传。如果您不发送最终CompleteMultipartUpload所有已上传的块将保留在 S3 中并产生费用。可以通过 AWS 控制台/CLI 或以编程方式使用aws-sdk-go.

于 2017-05-21T20:18:47.343 回答