

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 將預先簽章的 URL 下載從 適用於 Java 的 AWS SDK v1 遷移至 v2
<a name="migration-s3-presign-download"></a>

遷移預先簽章的 URL 下載程式碼，以使用非同步處理並存取第 2 版中擴展的下載選項。本主題說明如何從 1.x 版 (v1) 遷移至 的 2.x 版 (v2) 適用於 Java 的 AWS SDK。如需 v2 預先簽章 URL 下載功能的詳細資訊，請參閱 [使用 Amazon S3 預先簽章URLs](examples-s3-presign.md)。

## 高階變更
<a name="migration-s3-presign-high-level"></a>

下列清單摘要說明 v1 和 v2 之間預先簽章 URL 下載的主要差異：
+ **套件**：`com.amazonaws.services.s3`→ `software.amazon.awssdk.services.s3`。
+ **用戶端類別**： `AmazonS3` （同步） → `S3AsyncClient`（非同步）。
+ **架構**：同步封鎖呼叫 → 使用 進行非同步呼叫`CompletableFuture`。
+ **分段**：僅透過 Transfer Manager 提供 → 可直接在用戶端上使用 `multipartEnabled(true)`。
+ **Transfer Manager**：僅限檔案目的地 → 檔案、位元組或自訂轉換器。

## 相依性、套件和類別名稱的變更
<a name="migration-s3-presign-deps"></a>

下表顯示相依性和類別名稱從 v1 變更為 v2。


| 變更 | v1 |   v2 | 
| --- | --- | --- | 
| Maven 相依性 |  <pre><dependencyManagement><br />    <dependencies><br />        <dependency><br />            <groupId>com.amazonaws</groupId><br />            <artifactId>aws-java-sdk-bom</artifactId><br />            <version>{{1.12.7971}}</version><br />            <type>pom</type><br />            <scope>import</scope><br />        </dependency><br />    </dependencies><br /></dependencyManagement><br /><dependencies><br />    <dependency><br />        <groupId>com.amazonaws</groupId><br />        <artifactId>aws-java-sdk-s3</artifactId><br />    </dependency><br /></dependencies></pre>  |  <pre><dependencyManagement><br />    <dependencies><br />        <dependency><br />            <groupId>software.amazon.awssdk</groupId><br />            <artifactId>bom</artifactId><br />            <version>{{2.48.02}}</version><br />            <type>pom</type><br />            <scope>import</scope><br />        </dependency><br />    </dependencies><br /></dependencyManagement><br /><dependencies><br />    <dependency><br />        <groupId>software.amazon.awssdk</groupId><br />        <artifactId>s3</artifactId><br />    </dependency><br />    <!-- Optional: for Transfer Manager --><br />    <dependency><br />        <groupId>software.amazon.awssdk</groupId><br />        <artifactId>s3-transfer-manager</artifactId><br />    </dependency><br /></dependencies></pre>  | 
| 套件名稱 | com.amazonaws.services.s3 | software.amazon.awssdk.services.s3 | 
| 類別名稱 | AmazonS3, TransferManager | S3AsyncClient, S3TransferManager | 

1 Maven Central 網站上的[最新版本](https://central.sonatype.com/artifact/com.amazonaws/aws-java-sdk-bom)。 2 Maven Central 網站上的[最新版本](https://central.sonatype.com/artifact/software.amazon.awssdk/bom)。

## API 變更
<a name="migration-s3-presign-api-changes"></a>

### S3 用戶端下載
<a name="migration-s3-presign-api-s3client"></a>

下表比較 S3 用戶端下載的 v1 和 v2 API 呼叫。


| 使用案例 | v1 |   v2 | 
| --- | --- | --- | 
| 建立用戶端 |  <pre>AmazonS3 s3Client = <br />        AmazonS3ClientBuilder.defaultClient();</pre>  |  <pre>S3AsyncClient s3AsyncClient = <br />        S3AsyncClient.create();<br />AsyncPresignedUrlExtension extension = <br />        s3AsyncClient.presignedUrlExtension();</pre>  | 
| 產生預先簽章的 URL |  <pre>Date expiration = new Date(<br />        System.currentTimeMillis() + 600_000);<br />URL presignedUrl = s3Client.generatePresignedUrl(<br />        new GeneratePresignedUrlRequest(<br />            "my-bucket", "my-key")<br />            .withMethod(HttpMethod.GET)<br />            .withExpiration(expiration));</pre>  |  <pre>S3Presigner presigner = S3Presigner.create();<br />PresignedGetObjectRequest presigned = <br />        presigner.presignGetObject(r -> r<br />            .getObjectRequest(req -> req<br />                .bucket("my-bucket").key("my-key"))<br />            .signatureDuration(Duration.ofMinutes(10)));<br />URL presignedUrl = presigned.url();<br />presigner.close();</pre>  | 
| 建立下載請求 |  <pre>PresignedUrlDownloadRequest downloadRequest = <br />        new PresignedUrlDownloadRequest(presignedUrl);</pre>  |  <pre>PresignedUrlDownloadRequest downloadRequest = <br />        PresignedUrlDownloadRequest.builder()<br />            .presignedUrl(presignedUrl)<br />            .build();</pre>  | 
| 下載以串流 |  <pre>PresignedUrlDownloadResult result = <br />        s3Client.download(downloadRequest);<br />InputStream content = result.getS3Object()<br />        .getObjectContent();</pre>  |  <pre>ResponseBytes<GetObjectResponse> bytes = <br />        extension.getObject(downloadRequest,<br />            AsyncResponseTransformer.toBytes())<br />        .join();</pre>  | 
| 下載至 檔案 |  <pre>s3Client.download(downloadRequest,<br />        new File("/tmp/file.bin"));</pre>  |  <pre>extension.getObject(downloadRequest,<br />            Paths.get("/tmp/file.bin"))<br />        .join();</pre>  | 
| 使用範圍下載 |  <pre>PresignedUrlDownloadRequest rangeRequest = <br />        new PresignedUrlDownloadRequest(presignedUrl);<br />rangeRequest.setRange(0, 1023);<br />s3Client.download(rangeRequest);</pre>  |  <pre>PresignedUrlDownloadRequest rangeRequest = <br />        PresignedUrlDownloadRequest.builder()<br />            .presignedUrl(presignedUrl)<br />            .range("bytes=0-1023")<br />            .build();<br />extension.getObject(rangeRequest,<br />            Paths.get("/tmp/partial.bin"))<br />        .join();</pre>  | 

### Transfer Manager 下載
<a name="migration-s3-presign-api-tm"></a>

下表比較 Transfer Manager 下載的 v1 和 v2 API 呼叫。


| 使用案例 | v1 |   v2 | 
| --- | --- | --- | 
| 建立 Transfer Manager |  <pre>TransferManager tm = <br />        TransferManagerBuilder.standard().build();</pre>  |  <pre>S3TransferManager tm = <br />        S3TransferManager.create();</pre>  | 
| 下載 |  <pre>PresignedUrlDownload download = tm.download(<br />        new PresignedUrlDownloadRequest(presignedUrl),<br />        new File("/tmp/file.bin"));<br />download.waitForCompletion();</pre>  |  <pre>PresignedFileDownload download = <br />        tm.downloadFileWithPresignedUrl(<br />            PresignedDownloadFileRequest.builder()<br />                .presignedUrlDownloadRequest(<br />                    downloadRequest)<br />                .destination(Paths.get("/tmp/file.bin"))<br />                .addTransferListener(<br />                    LoggingTransferListener.create())<br />                .build());<br />download.completionFuture().join();</pre>  | 

如需詳細資訊，請參閱[使用預先簽章的 URL 下載](transfer-manager.md#transfer-manager-presigned-url-download)。

## 組態變更
<a name="migration-s3-presign-config"></a>

### S3 用戶端
<a name="migration-s3-presign-config-s3"></a>

下表說明從 v1 到 v2 的 S3 用戶端組態變更。


| 設定 | v1 |   v2 | 
| --- | --- | --- | 
| 分段組態 | PresignedUrlDownloadConfig.withDownloadSizePerRequest(long) | S3AsyncClient.builder().multipartConfiguration(c -> c.minimumPartSizeInBytes(...)) | 
| 自訂標頭 | PresignedUrlDownloadRequest.putCustomRequestHeader(String, String) | 不支援。只有 Range和 If-Match可以在下載時設定。 | 

### Transfer Manager
<a name="migration-s3-presign-config-tm"></a>

下表說明 Transfer Manager 組態從 v1 變更為 v2。


| 設定 | v1 |   v2 | 
| --- | --- | --- | 
| 進度追蹤 | PresignedUrlDownloadConfig.withS3progressListener(...) | PresignedDownloadFileRequest.builder().addTransferListener(...) | 
| 重試時繼續 | PresignedUrlDownloadConfig.withResumeOnRetry(true) | 不支援 | 
| 暫停/繼續 | 不支援 | 不支援 | 

**注意**  
 AWS CRT 型 S3 用戶端 (`S3AsyncClient.crtBuilder()`) 目前不支援預先簽章的 URL 延伸。請使用 `S3AsyncClient.builder()`。