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上找到。