1. 概述
在这个教程中,我们将学习如何使用Java在Amazon S3存储桶中重命名对象(文件或文件夹)。
Amazon Simple Storage Service (Amazon S3) 是一个流行的云存储服务,它允许用户在云端高效地存储和检索数据,具有高持久性、可用性和可扩展性。接下来的章节中,我们将使用AWS Java SDK与之交互。
2. 预备知识
为了在S3存储桶中重命名对象,我们可以利用AWS Java SDK提供的S3Client
类。
2.1. Maven依赖项
首先,我们需要在项目pom.xml
中声明AWS S3 SDK的依赖项:
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>s3</artifactId>
<version>2.24.9</version>
</dependency>
2.2. AWS凭证
我们还需要设置好AWS账户,并安装并配置AWS CLI(命令行工具),以便能通过程序访问AWS资源。获取这些步骤的详细信息,请参阅官方文档。
2.3. 初始化S3客户端
现在,我们将创建一个客户端来处理与S3服务的所有通信。要创建S3客户端,我们需要提供上一步中获取的带有凭据的AWS配置文件,并配置AWS区域:
S3Client s3Client = S3Client.builder()
.region(US_EAST_1)
.credentialsProvider(ProfileCredentialsProvider.create("default"))
.build();
我们将使用构建器设计模式创建客户端,这是一种创建设计模式,有助于构建复杂对象。在示例中,我们将创建一个位于US_EAST_1
区域的存储桶。如需更改首选区域,可以在官方文档中查找所有可用区域。
3. 使用复制和删除重命名对象
目前,SDK中唯一的方法是先使用不同的名称复制对象,然后删除原始对象。 这部分我们将演示这个过程,并解释每一步。
3.1. 复制S3对象
在这个步骤中,我们将使用上一步创建的客户端调用AWS API。
首先,我们需要定义请求的参数。假设我们有一个名为baeldung-s3-bucket
的存储桶和一个名为simpleCSVFile.csv
的CSV文件。我们想将文件重命名为renamedFile.csv
。以下是复制请求的参数概要:
String bucketName = "baeldung-s3-bucket";
String keyName = "simpleCSVFile.csv";
String destinationKeyName = "renamedFile.csv";
在定义了参数后,我们可以构建CopyObjectRequest
,并将其发送到AWS API:
CopyObjectRequest copyObjRequest = CopyObjectRequest.builder()
.sourceBucket(bucketName)
.sourceKey(keyName)
.destinationBucket(destinationKeyName)
.destinationKey(bucketName)
.build();
现在,我们可以使用AmazonS3
客户端和请求来复制对象:
s3Client.copyObject(copyRequest);
如果在这里停止并运行代码,你会看到已经有了两个文件,一个是你想要的新名字,另一个是原始的。
3.2. 删除S3对象
在复制完成后,我们也需要删除原始对象以完成重命名过程。这里,我们需要定义一个DeleteObjectRequest
,使用上一步中的参数:
DeleteObjectRequest deleteRequest = DeleteObjectRequest.builder()
.bucket(bucketName)
.key(keyName)
.build();
然后,再次调用S3客户端来删除原始对象:
s3Client.deleteObject(deleteRequest);
4. 重命名文件夹
前面的方法对于重命名简单对象效果很好。但当涉及到重命名文件夹时,情况会有所不同。在Amazon S3中重命名整个文件夹涉及到遍历文件夹内的所有对象并逐一重命名。
4.1. 列出源文件夹中的所有对象
首先,让我们列出给定文件夹中的所有对象:
ListObjectsV2Request listRequest = ListObjectsV2Request.builder()
.bucket(bucketName)
.prefix(sourceFolderKey)
.build();
ListObjectsV2Response listResponse = s3Client.listObjectsV2(listRequest);
List<S3Object> objects = listResponse.contents();
我们初始化ListObjectsV2Request
,传入存储桶名称和前缀。文件夹中的对象实际上是所有键前缀与文件夹名匹配的对象。
4.2. 重命名文件夹中的所有对象键
现在我们有了列出文件夹内所有对象的代码,只需要将它们复制到新位置,并删除原始对象:
for (S3Object s3Object : objects) {
String newKey = destinationFolderKey + s3Object.key().substring(sourceFolderKey.length());
// Copy object to destination folder
CopyObjectRequest copyRequest = CopyObjectRequest.builder()
.sourceBucket(bucketName)
.sourceKey(s3Object.key())
.destinationBucket(bucketName)
.destinationKey(newKey)
.build();
s3Client.copyObject(copyRequest);
// Delete object from source folder
DeleteObjectRequest deleteRequest = DeleteObjectRequest.builder()
.bucket(bucketName)
.key(s3Object.key())
.build();
s3Client.deleteObject(deleteRequest);
}
我们开始遍历对象列表,对于每个项目,我们生成一个新的键,通过替换旧文件夹名以获得新的名字。获取新键后,只需将对象复制到新位置并删除原始对象即可。
5. 总结
本文介绍了使用AWS Java SDK在S3存储桶中重命名文件和文件夹的方法。我们探讨了两种不同情况,都使用了相同的概念:先复制对象到新名称,再删除原始对象。
如往常一样,本文的完整代码可在GitHub上找到。