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

问题描述 投票:0回答:1

我有一个服务器端应用程序,它运行大量图像 URL 并将图像从这些 URL 上传到 S3。 文件通过 HTTP 提供。我使用

InputStream
下载它们,我使用
HttpURLConnection
方法从
getInputStream
获取它们。我将 InputStream 交给 AWS S3 客户端
putObject
方法 (AWS Java SDK v1),以将流上传到 S3。到目前为止一切顺利。

我正在尝试引入一个新的外部图像数据源。此数据源的问题在于,提供这些图像的 HTTP 服务器不会返回

Content-Length
HTTP 标头。这意味着我无法判断图像有多少字节,这是 AWS S3 客户端验证图像是否已从流正确上传到 S3 所需的数字。

我能想到处理这个问题的唯一方法是让服务器所有者将

Content-Length
HTTP 标头添加到他们的响应中(不太可能),或者首先将文件下载到内存缓冲区,然后将其上传到 S3在那里。

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

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

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

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

java scala amazon-s3 concurrency io
1个回答
0
投票

我之前使用过minio S3 API,我的结论是将内容存储在临时文件中,确定其大小,然后将其上传到S3指定内容大小。如果我在 S3 上计算大小,我会很难下载文件,有时会损坏。临时目录(k8s 中主要是emptyDir)的流程给了我 100% 的正确性。

© www.soinside.com 2019 - 2024. All rights reserved.