Java 使用TransferManager将大文件上载到AmazonS3存储桶的最佳方法
目前,我正在尝试将一个文件上载到AmazonS3存储桶,我对此进行了一些研究,发现如果文件足够大,类TransferManager会将文件拆分为小块,然后使用多个线程并行上载。现在在应用程序中,我们正在创建AmazonS3客户端的一个实例(在应用程序开始时创建的一个bean),并使用该AmazonS3客户端为用户上传文件所需的每个文件创建TransferManager类的一个实例,在上传完文件后(这由TransferManager的waitForCompletion方法检查)我们正在调用方法TransferManager.shutdownNow(false)来关闭它创建的所有线程,如下所示:Java 使用TransferManager将大文件上载到AmazonS3存储桶的最佳方法,java,spring,amazon-web-services,amazon-s3,Java,Spring,Amazon Web Services,Amazon S3,目前,我正在尝试将一个文件上载到AmazonS3存储桶,我对此进行了一些研究,发现如果文件足够大,类TransferManager会将文件拆分为小块,然后使用多个线程并行上载。现在在应用程序中,我们正在创建AmazonS3客户端的一个实例(在应用程序开始时创建的一个bean),并使用该AmazonS3客户端为用户上传文件所需的每个文件创建TransferManager类的一个实例,在上传完文件后(这由TransferManager的waitForCompletion方法检查)我们正在调用方法Tr
@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;
}
我仍然有疑问:
TransferManager
实例上调用Shutdownow
TransferManager负责管理以下资源:
连接和线程;共享TransferManager的单个实例
TransferManager,就像
AWS SDK for Java是线程安全的。调用TransferManager.shutdownNow()
在传输完成后释放资源
minUploadPartSize
为5MB,minUploadThresholdSize
为16MB。您可以使用TransferManager
对所有文件进行upload
上传,它将根据文件大小对文件进行分解。这些选项是可配置的。如果您知道所有文件都相对较小,则可能比较容易r改为使用putObject