給定 URL 從 S3 下載文件
一、簡介
在當今的軟體領域,與Amazon Simple Storage Service (S3)
等雲端儲存服務互動已成為許多應用程式的基本面向。一個常見要求是使用提供的 URL 下載儲存在 S3 中的檔案。
在本文中,我們將探索一種使用 Java、Spring Boot 和適用於 Java 的AWS 開發工具包來實現此目的的簡化方法。
2. 設定
首先,我們需要設定 AWS 憑證來存取 S3 儲存桶。這可以透過多種方式來完成。出於開發目的,我們可以在application.properties
檔案中設定憑證:
aws.accessKeyId= <your_access_key_id>
aws.secretKey= <your_secret_access_key>
aws.region= <your_region>
接下來,讓我們包含AWS S3 Maven 依賴項:
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>s3</artifactId>
<version>${amazon.s3.version}</version>
</dependency>
3. 配置S3客戶端
S3 用戶端通常是指允許使用者與 Amazon S3 互動的軟體或函式庫。由於我們使用的是 AWS Java SDK,因此我們將使用提供的 API 使用 Java AWS SDK 建立 S3 用戶端:
S3Client s3Client = S3Client.builder()
.region(Region.US_EAST_1)
.credentialsProvider(DefaultCredentialsProvider.create())
.build();
S3 用戶端在與 Amazon S3 互動時處理驗證和授權。它使用提供的憑證來驗證對 S3 服務的請求。在本例中,我們使用default credentials provider.
這通常會在環境變數中尋找憑證或在我們的先決條件設定中建立的共用憑證檔案。
4. 定義下載服務
讓我們定義一個與 S3Client 互動以進行下載的服務。
首先,讓我們從定義服務的方法契約開始:
public interface FileService {
FileDownloadResponse downloadFile(String s3url) throws IOException, S3Exception;
}
現在,讓我們按順序完成下載步驟。
4.1.從 URL 提取金鑰和儲存桶
在此步驟中,我們將重點放在從有效的 S3 URL 中提取基本訊息,特別是儲存桶名稱和物件金鑰。
假設我們有一個名為「 baeldung
」的檔案儲存在 S3 儲存桶中,其路徑如下:「 path/to/my/s3article.txt
」。這表示 S3 儲存桶內的分層結構,其中物件「 s3article.txt
」嵌套在目錄「 path
」、「 to
」和「 my
」中。
為了以程式設計方式提取此訊息,我們將使用 Java 的 URI 類別將 S3 URL 解碼為其元件。然後,我們將主機名稱(儲存桶名稱)和路徑(物件鍵)分開:
URI uri = new URI(s3Url);
String bucketName = uri.getHost();
String objectKey = uri.getPath()
.substring(1);
考慮到前面的範例,我們將擁有 URI“ s3://baeldung/path/to/my/s3article.txt
”,我們將提取儲存桶名稱為“ baeldung
”。代表儲存桶內路徑的物件鍵為「 path/to/my/s3article.txt
」。這裡重要的是,透過使用substring(1)
,我們將刪除前導“/”字符,導致物件鍵為“path/to/my/s3article.txt”,這是 S3 物件鍵所需的格式。
總之,在這裡我們可以識別檔案在 S3 儲存桶中的位置,使我們能夠建構請求並對所需的物件執行操作。
4.2.建置GetObjectRequest
現在,讓我們使用 AWS 開發工具包來建立GetObjectRequest
:
GetObjectRequest getObjectRequest = GetObjectRequest.builder()
.bucket(bucketName)
.key(objectKey)
.build();
GetObjectRequest
具有從 S3 檢索物件所需的信息,例如儲存桶名稱和要檢索的物件的金鑰。它還允許開發人員指定其他參數,例如版本 ID、範圍、回應標頭等,以自訂物件檢索過程的行為。
4.3.發送GetObjectRequest
準備好GetObjectRequest
後,我們將使用配置的S3Client
將其傳送到 Amazon S3 以檢索物件資料:
ResponseInputStream<GetObjectResponse> responseInputStream = s3ResponseReader.readResponse(getObjectRequest);
GetObjectResponse getObjectResponse = responseInputStream.response();
4.4.響應數據和元數據
從 Amazon S3 as ResponseInputStream<GetObjectResponse>
的回應後,我們將提取檔案內容以及關聯的元資料。
我們首先將文件內容提取為位元組數組:
byte[] fileContent = IOUtils.toByteArray(responseInputStream);
接下來,讓我們使用回應檢查一些有用的元資料:
// Get object metadata
String contentType = getObjectResponse.contentType();
String contentDisposition = getObjectResponse.contentDisposition()
String key = getObjectRequest.key();
String filename = extractFilenameFromKey(key);
String originalFilename = contentDisposition == null ? filename : contentDisposition.substring(contentDisposition.indexOf("=")+1);
將回應傳送回客戶端時需要一些元資料。我們將建立一個抽象FileDownloadResponse
,它將檔案內容封裝為位元組、 contentType,
和originalFilename
:
@Builder @Data @RequiredArgsConstructor public class FileDownloadResponse { private final byte[] fileContent; private final String originalFilename; private final String contentType; }
如果我們希望執行整合測試,我們可以考慮使用測試容器來模擬 S3。
5. 結論
在本文中,我們將快速了解如何使用提供的 URL 從 S3 下載檔案。我們使用由S3 Client組成的AWS Java SDK來使用戶能夠安全地存取和下載S3資源。它提供了一個方便且一致的 API 來對 S3 資源執行各種操作,從而簡化了 S3 儲存桶和物件的管理。
與往常一樣,本文的完整實作可以在 GitHub 上找到。