【发布时间】:2020-02-03 08:27:42
【问题描述】:
我的 Java Spring 应用程序中的以下方法直接将文件流式传输并上传到 Amazon S3 存储桶。我研究过,使用流可以使上传大文件(对于我的用例> 100MB 视频)更有效率。在使用 25MB 文件测试该方法时,我的 Java Spring 应用程序在 Kubernetes 集群设置中的内存使用量猛增了 200MB!我还尝试了一个 200MB 的文件,内存再次飙升至 ~2GB。没有抛出内存不足异常,但内存使用量没有下降。为什么会这样?
public void uploadFile(MultipartFile file, String saveFileName) {
try {
ObjectMetadata metadata = new ObjectMetadata();
if (file.getContentType() != null){
om.setContentType(file.getContentType());
}
metadata.setContentLength(file.getSize());
saveFileName = saveFileName.replaceAll(" ", "");
InputStream stream = file.getInputStream();
PutObjectRequest request = new PutObjectRequest(bucketName, saveFileName, stream, metadata);
request = request.withMetadata(om);
s3client.putObject(request);
stream.close();
} catch (AmazonClientException | IOException exception) {
// handle exception
}
}
【问题讨论】:
-
你应该把 stream.close() 放在 finally 块中。祝你有美好的一天!
-
请看我的回答 stackoverflow.com/a/64263423/1704634 ,它使用 S3OutputStream 自动切换到分段上传,以防流太大。当前使用 10MB 缓冲区,但这可以配置得更小/更大。
标签: java spring amazon-s3 file-upload kubernetes