将未知大小的文件上传到 S3 的最佳策略

Best strategy to upload files with unknown size to S3

提问人:polo 提问时间:2/14/2019 最后编辑:polo 更新时间:12/4/2022 访问量:2700

问:

我有一个服务器端应用程序,它通过大量图像 URL 运行,并将这些 URL 中的图像上传到 S3。 这些文件通过 HTTP 提供。我使用我从使用方法获得的下载它们。我将 InputStream 交给 AWS S3 客户端方法 (AWS Java 开发工具包 v1) 以将流上传到 S3。目前为止,一切都好。InputStreamHttpURLConnectiongetInputStreamputObject

我正在尝试引入新的外部图像数据源。此数据源的问题在于,提供这些图像的 HTTP 服务器不返回 HTTP 标头。这意味着我无法判断图像将是多少字节,这是 AWS S3 客户端验证图像是否正确从流上传到 S3 所需的数字。Content-Length

我能想到的处理这个问题的唯一方法是让服务器所有者将 HTTP 标头添加到他们的响应中(不太可能),或者先将文件下载到内存缓冲区,然后从那里将其上传到 S3。Content-Length

这些不是大文件,但我有很多。

在考虑先下载文件时,我担心内存占用和并发影响(无法同时上传和下载同一文件的块)。

由于我正在处理许多小文件,因此我怀疑如果我专注于多个文件而不是单个文件的并发性,并发问题可能会“解决”。因此,我不会同时下载和上传同一文件的块,而是使用我的 IO 有效地下载一个文件,同时上传另一个文件。

我很想听听你关于如何做到这一点的想法,最佳实践,陷阱或任何其他关于如何最好地解决这个问题的想法。

Java Scala Amazon-S3 并发 IO

评论

1赞 jingx 2/14/2019
putObjectJavaDoc 指出,“如果调用方没有提供 [内容长度],库将尽最大努力通过将输入流的内容缓冲到内存中来计算内容长度”。您是否尝试不指定长度?
0赞 polo 2/14/2019
@jingx这是一个很好的观点。感谢您指出。但是,在不知道长度的情况下,我无法验证上传是否成功。我将深入研究 AWS 开发工具包代码,看看我是否可以从它计算长度中获得一些信心。
0赞 Thilo 2/14/2019
对于小文件,内存缓冲区似乎是最佳解决方案。对于大文件,您还可以在磁盘上的临时文件中进行缓冲。它们有多大?
0赞 Thilo 2/14/2019
我真的没有看到任何并发问题。“无法同时上传和下载同一文件的块”:无论如何您都无法这样做,因为您需要在开始上传之前完成下载以计算字节数。
2赞 Michael - sqlbot 2/14/2019
“无法同时上传和下载同一文件的块”有一种方法可以做到这一点。我已经做到了。分段上传 API 允许您以小至 5 MB 的块形式上传对象,而无需了解最终对象大小。除最后一个区块外,每个区块必须至少为 5 MB,如果最后一个区块也恰好是第一个区块(仅当整个对象的总大小小于 5 MB 时才成立),则这仍然是有效的“分段”上传。

答: 暂无答案