如何重命名 Amazon S3 中的文件和文件夾
1. 概述
在本教程中,我們將探討如何使用 Java 重命名 Amazon S3 存儲桶中的對象(文件或文件夾)。
Amazon Simple Storage Service (Amazon S3) 是一種流行的雲存儲服務。它允許用戶在雲中存儲和檢索具有高持久性、可用性和可擴展性的數據。我們將在接下來的章節中使用適用於 Java 的 AWS 開發工具包與其進行交互。
2. 前提條件
要重命名 S3 存儲桶中的對象,我們可以利用 AWS SDK for Java 提供的S3Client
類。
2.1. Maven 依賴項
首先,我們需要在項目的pom.xml
中聲明 AWS S3 SDK依賴項:
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>s3</artifactId>
<version>2.20.123</version>
</dependency>
2.2. AWS 憑證
我們還需要設置一個 AWS 賬戶,安裝 AWS CLI ,
並使用我們的 AWS 憑證( AWS_ACCESS_KEY_ID
和AWS_SECERET_ACCESS_KEY
)對其進行配置,以便能夠以編程方式訪問 AWS 資源。我們可以在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";
定義參數後,我們可以構造將發送到 AWS API 的CopyObjectRequest
:
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. 結論
在本文中,我們探討了使用適用於 Java 的 AWS 開發工具包重命名 S3 存儲桶中的文件和文件夾的方法。我們探索了兩種不同的情況,它們使用相同的概念來重命名對象,用新名稱複製它們並刪除原始名稱。
與往常一樣,本文的完整代碼可以在 GitHub 上獲取。