

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

# 將 Java 型 S3 非同步用戶端設定為使用平行傳輸
<a name="s3-async-client-multipart"></a>

自 2.27.5 版起，標準 Java 型 S3 非同步用戶端支援自動平行傳輸 （分段上傳和下載）。您可以在建立 Java 型 S3 非同步用戶端時設定平行傳輸的支援。

本節說明如何啟用平行傳輸，以及如何自訂組態。

## 建立 執行個體 `S3AsyncClient`
<a name="s3-async-client-multipart-create"></a>

當您在不呼叫[建置器](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/s3/S3AsyncClientBuilder.html)上的任何`multipart*`方法的情況下建立`S3AsyncClient`執行個體時，不會啟用平行傳輸。下列每個陳述式都會建立 Java 型 S3 非同步用戶端，而不支援分段上傳和下載。

### 在沒有分段支援*的情況下*建立
<a name="s3-async-client-mp-off"></a>

**Example**  

```
import software.amazon.awssdk.auth.credentials.ProcessCredentialsProvider;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3.S3AsyncClient;


S3AsyncClient s3Client = S3AsyncClient.create();

S3AsyncClient s3Client2 = S3AsyncClient.builder().build();

S3AsyncClient s3Client3 = S3AsyncClient.builder()
        .credentialsProvider(ProcessCredentialsProvider.builder().build())
        .region(Region.EU_NORTH_1)
        .build();
```

### *使用*分段支援建立
<a name="s3-async-client-mp-on"></a>

若要使用預設設定啟用平行傳輸，請呼叫建置器`multipartEnabled`上的 並傳入，`true`如下列範例所示。

**Example**  

```
S3AsyncClient s3AsyncClient2 = S3AsyncClient.builder()
        .multipartEnabled(true)
        .build();
```

`thresholdInBytes` 和 `minimumPartSizeInBytes`設定的預設值為 8 MiB。

如果您自訂分段設定，會自動啟用平行傳輸，如下所示。

**Example**  

```
import software.amazon.awssdk.services.s3.S3AsyncClient;
import static software.amazon.awssdk.transfer.s3.SizeConstant.MB;


S3AsyncClient s3AsyncClient2 = S3AsyncClient.builder()
        .multipartConfiguration(b -> b
                .thresholdInBytes(16 * MB)
                .minimumPartSizeInBytes(10 * MB))
        .build();
```

## 上傳大小不明的串流
<a name="java-async-client-stream-unknown-size"></a>

啟用分段的 Java 型 S3 非同步用戶端可以有效地處理輸入串流，其中總大小事先未知：

```
public PutObjectResponse asyncClient_multipart_stream_unknown_size(String bucketName, String key, InputStream inputStream) {

    S3AsyncClient s3AsyncClient = S3AsyncClient.builder().multipartEnabled(true).build();
    ExecutorService executor = Executors.newSingleThreadExecutor();
    AsyncRequestBody body = AsyncRequestBody.fromInputStream(inputStream, null, executor); // 'null' indicates that the
                                                                                           // content length is unknown.
    CompletableFuture<PutObjectResponse> responseFuture =
            s3AsyncClient.putObject(r -> r.bucket(bucketName).key(key), body)
                    .exceptionally(e -> {
                        if (e != null) {
                            logger.error(e.getMessage(), e);
                        }
                        return null;
                    });

    PutObjectResponse response = responseFuture.join(); // Wait for the response.
    executor.shutdown();
    return response;
}
```

此方法可防止手動指定不正確的內容長度時可能發生的問題，例如截斷物件或上傳失敗。