gpt4 book ai didi

java - 使用 TransferManager 将大文件上传到 Amazon S3 存储桶的最佳方法

转载 作者:行者123 更新时间:2023-11-30 06:15:20 24 4
gpt4 key购买 nike

目前,我正在尝试将文件上传到亚马逊 S3 存储桶,我一直在对此进行一些研究,发现 TransferManager 类会将文件分割成小块,以便使用多个线程并行上传文件(如果文件)够大了。现在,在应用程序中,我们正在创建一个 AmazonS3 客户端实例(在应用程序启动时创建的一个 bean),并使用该 AmazonS3 客户端为用户需要上传的每个文件创建 TransferManager 类的实例。文件上传完成后(由 TransferManager 的 waitForCompletion 方法检查),我们调用方法 TransferManager.shutdownNow(false) 来关闭由它创建的所有线程,如下所示:

@AutoWired
private AmazonS3 s3Client;


/**
* Uploads a file using TransferManager from a MultipartFile.
*/
public String uploadFileParallelized(MultipartFile file) {
String fileName;
TransferManager transferManager =
TransferManagerBuilder.standard().withS3Client(this.s3Client).build();

try {
String extension = getExtensionFromBytes(file.getBytes());
fileName = getFileName(extension);

ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentLength(file.getSize());
metadata.setContentType(file.getContentType());

Upload upload = transferManager.upload(getBucketName(), this.folder + fileName,
file.getInputStream(), metadata);
upload.waitForCompletion();
} catch (IOException | AmazonClientException | InterruptedException e) {
throw new FileUploadException("Couldn't upload the file to S3: " + e.getLocalizedMessage(),
e);
} finally {
transferManager.shutdownNow(false);
}


return fileName;
}

我仍然有疑问:

  1. 我不确定您是否应该为每次上传实例化一个transferManager,或者我们应该只使用一个TransferManager实例(可能是一个bean),但在这种情况下我将无法调用transferManager。 shutdownNow(false) 方法导致我无法将其用于第二次上传。

  2. 即使我不调用 shutdownNow 方法,TransferManager 是否也会关闭用于上传文件的所有线程?

  3. 是否可以使用相同的 AmazonS3 客户端创建 TransferManager 的多个实例,还是应该为我们需要的每个 TransferManager 创建一个 S3Client?

  4. 即使文件很小(假设它小于 5 MB),我们是否也应该使用 TransferManager

最佳答案

https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/transfer/TransferManager.html

  1. 完成所有上传后,您应该在单个 TransferManager 实例上调用 shutdownNow

    TransferManager is responsible for managing resources such as connections and threads; share a single instance of TransferManager whenever possible. TransferManager, like all the client classes in the AWS SDK for Java, is thread safe. Call TransferManager.shutdownNow() to release the resources once the transfer is complete.

  2. 是的。

    By default, the thread pool will shutdown when the transfer manager instance is garbage collected.

  3. 您应该使用相同的 S3 客户端。它是线程安全的。

  4. minUploadPartSize 为 5MB,minUploadThresholdSize 为 16MB。您可以使用TransferManager上传您的所有文件,它会根据文件大小分解文件。这些选项是可配置的。如果您知道所有文件都相对较小,则使用 putObject 可能会更容易。

关于java - 使用 TransferManager 将大文件上传到 Amazon S3 存储桶的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49330088/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com