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

pol*_*olo 7 java io concurrency scala amazon-s3

我有一个服务器端应用程序,它运行大量图像 URL 并将图像从这些 URL 上传到 S3。这些文件通过 HTTP 提供。我使用InputStreamI get from an HttpURLConnectionusinggetInputStream方法下载它们。我将 InputStream 交给 AWS S3 客户端putObject方法 (AWS Java SDK v1) 以将流上传到 S3。到现在为止还挺好。

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

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

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

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

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

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