使用 Java 在 S3 中更新 zip 文件

Posted

技术标签:

【中文标题】使用 Java 在 S3 中更新 zip 文件【英文标题】:Update zip file in S3 using Java 【发布时间】:2021-07-23 10:09:18 【问题描述】:

我有一个 java 应用程序,我想在其中处理大约 10GB 的文件记录并将它们压缩到一个文件夹并上传到 S3。由于整体大小约为 10GB,我无法将所有文件添加到内存中然后上传到 S3,因此我需要在 S3 中创建一个 zip 文件并通过对我的文件进行分区来更新 zip 文件的内容。有什么方法可以在不下载到本地文件夹的情况下更新 S3 中的现有 zip 文件?

【问题讨论】:

【参考方案1】:

你可以使用 aws java sdk 来实现它

<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-java-sdk</artifactId>
    <version>1.11.398</version>
</dependency>

使用以下方法创建一个 amazon s3 客户端

BasicAWSCredentials credentials = new BasicAWSCredentials("access_key", "secret_key"); 
AmazonS3 amazonS3 = AmazonS3ClientBuilder.standard().withCredentials(new AWSStaticCredentialsProvider(credentials)).build();

创建一个 TransferManager 并设置 MultipartUploadThresholdload。 Amazon S3 规定最小部分大小为 5mb,所以我们在这里使用 5mb。您可以根据需要增加尺寸。

TransferManager tm = TransferManagerBuilder.standard()
  .withS3Client(amazonS3)
  .withMultipartUploadThreshold((long) (5 * 1024 * 1024))
  .build();

设置您要上传的 S3 存储桶名称,keyName 将用于命名上传的文件。 tm.upload 将在后台启动上传过程。

String bucketName = "my-bucket";
String keyName = "mydata.zip";
File file = new File("path_to_file/mydata.zip");
Upload upload = tm.upload(bucketName, keyName, file);

waitForCompletion 是阻塞调用,一旦函数完成上传文件到 s3 就会返回结果。

try 
    upload.waitForCompletion();
 catch (AmazonClientException e) 
    // ...

【讨论】:

以上是关于使用 Java 在 S3 中更新 zip 文件的主要内容,如果未能解决你的问题,请参考以下文章

AWS CloudFormation 更新 Lambda 代码以在 S3 存储桶中使用最新版本

AWS cloudfront 不更新 S3 中的文件更新

基于其他 zip 文件 C# 更新 zip 文件

python - 更新zip存档时文件重复

如何更新 zip 存档中的一个文件

如何更新现有Amazon S3文件的元数据?