

 **此頁面僅適用於使用 Vaults 和 2012 年原始 REST API 的 Amazon Glacier 服務的現有客戶。**

如果您要尋找封存儲存解決方案，建議您在 Amazon Glacier Instant Retrieval、S3 Glacier Flexible Retrieval 和 S3 Glacier Deep Archive 中使用 Amazon Glacier 儲存類別。 Amazon S3 若要進一步了解這些儲存選項，請參閱 [Amazon Glacier 儲存類別](https://aws.amazon.com/s3/storage-classes/glacier/)。

Amazon Glacier （原始獨立保存庫型服務） 不再接受新客戶。Amazon Glacier 是一項獨立服務，具有自己的 APIs，可將資料存放在保存庫中，並與 Amazon S3 和 Amazon S3 Glacier 儲存類別不同。您現有的資料將在 Amazon Glacier 中無限期保持安全且可存取。不需要遷移。對於低成本、長期的封存儲存， AWS 建議使用 [Amazon S3 Glacier 儲存類別](https://aws.amazon.com/s3/storage-classes/glacier/)，透過 S3 儲存貯體型 APIs、完整 AWS 區域 可用性、降低成本 AWS 和服務整合，提供卓越的客戶體驗。如果您想要增強功能，請考慮使用我們的解決方案指南，將資料從 Amazon S3 Glacier 保存庫傳輸至 Amazon S3 Glacier 儲存類別，以遷移至 Amazon S3 Glacier 儲存類別。 [AWS Amazon Glacier Amazon S3 ](https://aws.amazon.com/solutions/guidance/data-transfer-from-amazon-s3-glacier-vaults-to-amazon-s3/)

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

# 上傳分段中的大型封存 (分段上傳)
<a name="uploading-archive-mpu"></a>

**Topics**
+ [分段上傳程序](#MPUprocess)
+ [現況](#qfacts)
+ [使用 上傳大型封存 AWS CLI](uploading-an-archive-mpu-using-cli.md)
+ [範例：使用適用於 Java 的 Amazon 開發套件，以部分形式上傳大型封存](uploading-an-archive-mpu-using-java.md)
+ [使用 上傳大型封存 適用於 .NET 的 AWS SDK](uploading-an-archive-mpu-using-dotnet.md)
+ [使用 REST API 上傳分段中的大型封存](uploading-an-archive-mpu-using-rest.md)

## 分段上傳程序
<a name="MPUprocess"></a>

如 中所述[在 Amazon Glacier 中上傳封存](uploading-an-archive.md)，我們鼓勵 Amazon Glacier (Amazon Glacier) 客戶使用分段上傳來上傳大於 100 MB (MiB) 的封存。

1. **啟動分段上傳** 

   當您傳送啟動分段上傳的請求時，Amazon Glacier 會傳回分段上傳 ID，這是分段上傳的唯一識別符。任何後續分段上傳操作中都需要此 ID。此 ID 在 Amazon Glacier 完成任務後至少 24 小時內不會過期。

   當您要求啟動分段上傳時，請指定分段大小 (以位元組為單位)。您上傳的每個分段，除了最後一個分段，都必須為這個大小。
**注意**  
您不需要了解使用分段上傳時的整體存檔大小。這表示您在開始上傳存檔時，可以在不知道存檔大小的情況下，使用分段上傳。您只需要在啟動分段上傳時，決定分段大小。

   在起始分段上傳請求時，您也可以提供選用的封存描述。

1. **分段上傳**

   對於每個分段上傳請求，您必須包含在步驟 1 取得的分段上傳 ID。在請求中，您還必須指定內容範圍 (以位元組為單位)，識別分段在最終封存中的位置。Amazon Glacier 稍後會使用內容範圍資訊，以適當的順序組合封存。由於您提供內容範圍給上傳的每個分段，它會在封存的最終組件中決定分段的位置，因此您可以任何順序上傳分段。您也可以平行上傳這些分段。如果您使用和之前上傳分段相同的內容範圍上傳新的分段，將會覆寫之前上傳的分段。

1. **完成 (或停止) 分段上傳**

   上傳所有封存分段之後，您可以完整的操作。同樣地，您必須在請求中指定上傳 ID。Amazon Glacier 會根據您提供的內容範圍，以遞增順序串連組件來建立封存。Amazon Glacier 對完整分段上傳請求的回應包含新建立封存的封存 ID。如果您在啟動分段上傳請求中提供選用的封存描述，Amazon Glacier 會將其與組合的封存建立關聯。在您成功完成分段上傳後，您無法參照分段上傳 ID。這表示您無法存取與該分段上傳 ID 關聯的分段。

   如果停止分段上傳，您即無法使用該分段上傳 ID 上傳更多的分段。與已停止分段上傳關聯之任何部分耗用的所有儲存體都會釋出。如有任何部分上傳正在進行，則會在停止後仍會成功或失敗。

### 其他分段上傳操作
<a name="additional-mpu-operations"></a>

Amazon Glacier (Amazon Glacier) 提供下列額外的分段上傳 API 呼叫。

 
+ **列出部分**：使用此作業時，您可以列出特定分段上傳的部分。它會傳回有關已針對分段上傳上傳之分段的資訊。對於每個清單組件請求，Amazon Glacier 會傳回最多 1，000 個組件的資訊。如果有更多分段要針對分段上傳列出，結果會分頁並在繼續列出的回應中傳回標記。您需要傳送額外的請求，以擷取後續分段。請注意，傳回的組件清單不包含尚未完成之上傳的組件。
+ **列出分段上傳**：使用此作業，您即可取得進行中之分段上傳的清單。進行中的分段上傳是您已啟動但尚未完成或已停止的上傳。對於每個列出分段上傳請求，Amazon Glacier 會傳回最多 1,000 個分段上傳。如果有更多分段要列出，則結果會分頁並在繼續列出的回應中傳回標記。您需要傳送額外的請求，以擷取剩餘的分段上傳。

## 現況
<a name="qfacts"></a>

下表提供分段上傳核心規格。


| 項目 | 規格 | 
| --- | --- | 
| 最大封存大小 | 10,000 x 4 gibibytes (GiB)  | 
| 每次上傳的組件數目上限 | 10,000 | 
| 組件大小 | 1 MiB 至 4 GiB，最後一個部分可以是 < 1 MiB。您可以位元組指定大小值。 部分大小必須是 1 MiB (1024 kibibytes [KiB]) 乘以 2 的乘方。例如，`1048576` (1 MiB)、`2097152` (2 MiB)、`4194304` (4 MiB)、`8388608` (8 MiB)。  | 
| 列出組件要求的傳回組件數上限 | 1,000  | 
| 列出分段上傳要求所傳回的分段上傳數目上限 | 1,000  | 

# 使用 上傳大型封存 AWS CLI
<a name="uploading-an-archive-mpu-using-cli"></a>

您可以使用 AWS Command Line Interface () 在 Amazon Glacier (Amazon Glacier) 中上傳封存AWS CLI。為了改善大型封存的上傳體驗，Amazon Glacier 提供多種 API 操作來支援分段上傳。透過使用這些 API 作業，您能夠以部分形式上傳封存。這些封存部分可個別、依任何順序以及同時上傳。如果某個部分上傳失敗，您需要再次上傳該部分，而不是整個封存。您可以為大小介於 1 位元組到 40,000 GiB 之間的封存使用分段上傳。

如需 Amazon Glacier 分段上傳的詳細資訊，請參閱 [上傳分段中的大型封存 (分段上傳)](uploading-archive-mpu.md)。

**Topics**
+ [（先決條件） 設定 AWS CLI](#Creating-Vaults-CLI-Setup)
+ [(先決條件) 安裝 Python](#Uploading-Archives-mpu-CLI-Install-Python)
+ [（先決條件） 建立 Amazon Glacier 保存庫](#Uploading-Archives-mpu-CLI-Create-Vault)
+ [範例：使用 分段上傳大型封存 AWS CLI](#Uploading-Archives-mpu-CLI-Implementation)

## （先決條件） 設定 AWS CLI
<a name="Creating-Vaults-CLI-Setup"></a>

1. 下載和設定 AWS CLI。如需相關指示，請參閱《AWS Command Line Interface 使用者指南》**中的下列主題：

    [安裝 AWS Command Line Interface](https://docs.aws.amazon.com/cli/latest/userguide/installing.html) 

   [設定 AWS Command Line Interface](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html)

1. 在命令提示中輸入下列命令來驗證您的 AWS CLI 設定。這些命令不會明確提供登入資料，因此會使用預設描述檔的登入資料。
   + 嘗試使用幫助命令。

     ```
     aws help
     ```
   + 若要取得已設定帳戶上的 Amazon Glacier 保存庫清單，請使用 `list-vaults`命令。將 *123456789012* 取代為您的 AWS 帳戶 ID。

     ```
     aws glacier list-vaults --account-id 123456789012
     ```
   + 若要查看 目前的組態資料 AWS CLI，請使用 `aws configure list`命令。

     ```
     aws configure list
     ```

## (先決條件) 安裝 Python
<a name="Uploading-Archives-mpu-CLI-Install-Python"></a>

若要完成分段上傳，您必須計算要上傳之封存的 SHA256 樹雜湊。這樣做與計算要上傳之檔案的 SHA256 樹雜湊不同。若要計算您要上傳之封存的 SHA256 樹雜湊，您可以使用 Java、C\$1 (使用 .NET) 或 Python。在此範例中，您將使用 Python。如需使用 Java 或 C\$1 的指示，請參閱[運算檢查總和](checksum-calculations.md)。

如需安裝 Python 的詳細資訊，請參閱《*Boto3 開發人員指南*》中的[安裝或更新 Python](https://boto3.amazonaws.com/v1/documentation/api/latest/guide/quickstart.html#installation)。

## （先決條件） 建立 Amazon Glacier 保存庫
<a name="Uploading-Archives-mpu-CLI-Create-Vault"></a>

若要使用下列範例，您必須建立至少一個 Amazon Glacier 保存庫。如需有關建立保存庫的詳細資訊，請參閱[在 Amazon Glacier 中建立保存庫](creating-vaults.md)。

## 範例：使用 分段上傳大型封存 AWS CLI
<a name="Uploading-Archives-mpu-CLI-Implementation"></a>

在此範例中，您將建立檔案並使用分段上傳 API 作業，將此檔案以部分的形式上傳到 Amazon Glacier。
**重要**  
開始此程序之前，請確認您已執行所有必要步驟。若要上傳封存，您必須建立保存庫、設定 AWS CLI 並準備好使用 Java、C\$1 或 Python 來計算 SHA256 樹雜湊。

下列程序使用 `initiate-multipart-upload`、 `upload-multipart-part`和 `complete-multipart-upload` AWS CLI 命令。

如需有關這些命令之一的詳細資訊，請參閱《AWS CLI 命令參考》**中 [https://docs.aws.amazon.com/cli/latest/reference/glacier/initiate-multipart-upload.html](https://docs.aws.amazon.com/cli/latest/reference/glacier/initiate-multipart-upload.html)、[https://docs.aws.amazon.com/cli/latest/reference/glacier/upload-multipart-part.html](https://docs.aws.amazon.com/cli/latest/reference/glacier/upload-multipart-part.html) 和 [https://docs.aws.amazon.com/cli/latest/reference/glacier/complete-multipart-upload.html](https://docs.aws.amazon.com/cli/latest/reference/glacier/complete-multipart-upload.html)。

1. 使用 [https://docs.aws.amazon.com/cli/latest/reference/glacier/initiate-multipart-upload.html](https://docs.aws.amazon.com/cli/latest/reference/glacier/initiate-multipart-upload.html) 命令以建立分段上傳資源。請指定在請求中部分大小 (以位元組為單位)。您上傳的每個部分，除了最後一個部分，都將是這個大小。您不需要了解啟動上傳時的整體封存大小。但是，在完成最後一步的上傳時，您將需要每個部分的總大小 (以位元組為單位)。

   在下列命令中，將 `--vault-name` 和 `--account-ID` 參數的值替換為您自己的資訊。此命令指定您將上傳每個檔案部分大小為 1 MiB (1024 x 1024 位元組) 的封存。如有需要，請替換此 `--part-size` 參數值。

   ```
   aws glacier initiate-multipart-upload --vault-name awsexamplevault --part-size 1048576 --account-id 123456789012
   ```

   預期的輸出結果：

   ```
   {
   "location": "/123456789012/vaults/awsexamplevault/multipart-uploads/uploadId",
   "uploadId": "uploadId"
   }
   ```

   完成後，命令將輸出分段上傳資源在 Amazon Glacier 中的上傳 ID 和位置。於後續步驟中，您將會使用此上傳 ID。

1. 在此範例中，您可以使用下列命令建立 4.4 MiB 檔案，將其分割成 1 MiB 區塊，然後上傳每個區塊。若要上傳自己的檔案，您可以按照類似的程序，將資料分區並上傳每個部分。

   

**Linux 或 macOS**  
下列命令會在 Linux 或 macOS 上建立名為 `file_to_upload` 的 4.4 MiB 檔案。

   ```
   mkfile -n 9000b file_to_upload
   ```

**Windows**  
下列命令會在 Windows 上建立名為 `file_to_upload` 的 4.4 MiB 檔案。

   ```
   fsutil file createnew file_to_upload 4608000
   ```

1. 接下來，您將這個檔案分割成 1 MiB 區塊。

   ```
   split -b 1048576 file_to_upload chunk
   ```

   您現在擁有以下五個區塊。前四個是 1 MiB，最後一個大約是 400 KiB。

   ```
   chunkaa
   chunkab
   chunkac
   chunkad
   chunkae
   ```

1. 使用 [https://docs.aws.amazon.com/cli/latest/reference/glacier/upload-multipart-part.html](https://docs.aws.amazon.com/cli/latest/reference/glacier/upload-multipart-part.html) 命令以上傳部分封存。您可以依任何順序上傳封存部分。您也可以平行上傳這些部分。您可以上傳多達 10,000 個部分的分段上傳。

   在下列命令中，替換 `--vault-name`、`--account-ID` 和 `--upload-id` 參數的值。上傳 ID 必須與 `initiate-multipart-upload` 命令輸出的 ID 相符。此 `--range` 參數指定您將上傳大小為 1 MiB (1024 x 1024 位元組) 的部分。此大小必須符合您在 `initiate-multipart-upload` 命令中指定的大小。如有需要，請調整此大小值。此 `--body` 參數會指定您要上傳之部分的名稱。

   ```
   aws glacier upload-multipart-part --body chunkaa --range='bytes 0-1048575/*' --vault-name awsexamplevault --account-id 123456789012 --upload-id upload_ID
   ```

   如果成功，該命令將產生輸出，其中內含上傳部分的檢查總和。

1. 再次執行 `upload-multipart-part` 命令，以上傳分段上傳的剩餘部分。更新每個命令的 `--range` 和 `–-body` 參數值，以符合您要上傳的部分。

   ```
   aws glacier upload-multipart-part --body chunkab --range='bytes 1048576-2097151/*' --vault-name awsexamplevault --account-id 123456789012 --upload-id upload_ID
   ```

   ```
   aws glacier upload-multipart-part --body chunkac --range='bytes 2097152-3145727/*' --vault-name awsexamplevault --account-id 123456789012 --upload-id upload_ID
   ```

   ```
   aws glacier upload-multipart-part --body chunkad --range='bytes 3145728-4194303/*' --vault-name awsexamplevault --account-id 123456789012 --upload-id upload_ID
   ```

   ```
   aws glacier upload-multipart-part --body chunkae --range='bytes 4194304-4607999/*' --vault-name awsexamplevault --account-id 123456789012 --upload-id upload_ID
   ```
**注意**  
最終命令的 `--range` 參數值較小，因為上傳的最後一部分小於 1 MiB。如果成功，每個命令都會產生輸出，內含每個上傳部分的檢查總和。

1. 接下來，您將組合封存並完成上傳。您必須包含封存的總大小和 SHA256 樹雜湊。

   若要計算封存的 SHA256 樹雜湊，您可以使用 Java、C\$1 或 Python。在此範例中，您將使用 Python。如需使用 Java 或 C\$1 的指示，請參閱[運算檢查總和](checksum-calculations.md)。

   建立 Python 檔案 `checksum.py` 並插入下列程式碼。如果需要，請替換原始檔案的名稱。

   ```
   from botocore.utils import calculate_tree_hash
   					
   checksum = calculate_tree_hash(open('file_to_upload', 'rb'))
   print(checksum)
   ```

1. 執行 `checksum.py` 以計算 SHA256 樹雜湊。以下雜湊可能與輸出不相符。

   ```
   $ python3 checksum.py
   $ 3d760edb291bfc9d90d35809243de092aea4c47b308290ad12d084f69988ae0c
   ```

1. 使用 [https://docs.aws.amazon.com/cli/latest/reference/glacier/complete-multipart-upload.html](https://docs.aws.amazon.com/cli/latest/reference/glacier/complete-multipart-upload.html) 命令完成封存上傳。替換 `--vault-name`、`--account-ID`、`--upload-ID` 和 `--checksum` 參數的值。`--archive` 參數值指定封存的總大小 (以位元組為單位)。這個值必須是您上傳的個別部分之所有大小的總和。如有需要，請替換此值。

   ```
   aws glacier complete-multipart-upload --archive-size 4608000 --vault-name awsexamplevault --account-id 123456789012 --upload-id upload_ID --checksum checksum
   ```

   完成後，命令將輸出封存的 ID、檢查總和和和 Amazon Glacier 中的位置。

# 範例：使用適用於 Java 的 Amazon 開發套件，以部分形式上傳大型封存
<a name="uploading-an-archive-mpu-using-java"></a>

適用於 Java 的 Amazon 開發套件提供的[高階和低階 API](using-aws-sdk.md) 都提供了上傳大型封存的方法 (請參閱 [在 Amazon Glacier 中上傳封存](uploading-an-archive.md))。

 
+ 高階的 API 提供了一種可用來上傳任何大小的封存的方法。根據您上傳的檔案， 方法會在單一操作中上傳封存，或使用 Amazon Glacier (Amazon Glacier) 中的分段上傳支援來分段上傳封存。
+ 低階 API 對應接近底層 REST 實作。因此，它提供一個方法，在一個操作中上傳較小的封存，以及一組方法，可支援分段上傳以上傳較大封存。本節說明使用低階 API 以部分形式上傳大型封存。

如需高階和低階的 API 的更多資訊，請參閱 [適用於 Java 的 AWS SDK 搭配 Amazon Glacier 使用](using-aws-sdk-for-java.md)。

**Topics**
+ [使用 的高階 API 分段上傳大型封存 適用於 Java 的 AWS SDK](#uploading-an-archive-in-parts-highlevel-using-java)
+ [使用 的低階 API 分段上傳大型封存 適用於 Java 的 AWS SDK](#uploading-an-archive-mpu-using-java-lowlevel)

## 使用 的高階 API 分段上傳大型封存 適用於 Java 的 AWS SDK
<a name="uploading-an-archive-in-parts-highlevel-using-java"></a>

您可以使用高階 API 的相同方法來上傳小型或大型封存。根據封存大小，高階 API 方法會決定在單一操作中上傳封存，還是使用 Amazon Glacier 提供的分段上傳 API。如需詳細資訊，請參閱[使用 的高階 API 上傳封存 適用於 Java 的 AWS SDK](uploading-an-archive-single-op-using-java.md#uploading-an-archive-single-op-high-level-using-java)。

## 使用 的低階 API 分段上傳大型封存 適用於 Java 的 AWS SDK
<a name="uploading-an-archive-mpu-using-java-lowlevel"></a>

對於精細控制上傳，您可以使用低階 API，您可以設定請求和處理回應。以下是使用 適用於 Java 的 AWS SDK以部分形式上傳大型封存的步驟。

 

1. 建立 `AmazonGlacierClient` 類別的執行個體 (用戶端)。

   您需要指定要儲存封存 AWS 的區域。您使用此用戶端執行的所有操作都會套用到該 AWS 區域。

1. 呼叫 `initiateMultipartUpload` 方法以啟動分段上傳。

   您需要提供要上傳存檔的文件庫名稱、要用於上傳存檔部分的部分大小以及可選說明。您可以透過建立 `InitiateMultipartUploadRequest` 類別的執行個體，來提供這項資訊。在回應中，Amazon Glacier 會傳回上傳 ID。

1. 透過呼叫 `uploadMultipartPart` 方法上傳部分。

   對於您上載的每個部分，您需要提供文件庫名稱、在該部分中上傳的最終組合的存檔中的位元組範圍、部分資料的檢查總和和上傳 ID。

1. 呼叫 `completeMultipartUpload` 方法以計算分段上傳。

   您需要提供上傳 ID、整個封存的檢查總和、封存大小 (您上傳的所有部分的組合大小) 和保存庫名稱。Amazon Glacier 會從上傳的組件建構封存，並傳回封存 ID。

### 範例：使用 在組件中上傳大型封存 適用於 Java 的 AWS SDK
<a name="upload-archive-mpu-java-example"></a>

下列 Java 程式碼範例使用 適用於 Java 的 AWS SDK 將封存上傳至保存庫 (`examplevault`)。如需執行此範例的逐步說明，請參閱 [使用 Eclipse 執行 Amazon Glacier 的 Java 範例](using-aws-sdk-for-java.md#setting-up-and-testing-sdk-java)。您必須如所示，使用要上傳的檔案名稱更新程式碼。

 

**注意**  
此範例對從 1 MB 到 1 GB 的部分大小有效。不過，Amazon Glacier 支援部分大小最多 4 GB。

**Example**  

```
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;

import com.amazonaws.AmazonClientException;
import com.amazonaws.AmazonServiceException;
import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.services.glacier.AmazonGlacierClient;
import com.amazonaws.services.glacier.TreeHashGenerator;
import com.amazonaws.services.glacier.model.CompleteMultipartUploadRequest;
import com.amazonaws.services.glacier.model.CompleteMultipartUploadResult;
import com.amazonaws.services.glacier.model.InitiateMultipartUploadRequest;
import com.amazonaws.services.glacier.model.InitiateMultipartUploadResult;
import com.amazonaws.services.glacier.model.UploadMultipartPartRequest;
import com.amazonaws.services.glacier.model.UploadMultipartPartResult;
import com.amazonaws.util.BinaryUtils;

public class ArchiveMPU {

    public static String vaultName = "examplevault";
    // This example works for part sizes up to 1 GB.
    public static String partSize = "1048576"; // 1 MB.
    public static String archiveFilePath = "*** provide archive file path ***";
    public static AmazonGlacierClient client;
    
    public static void main(String[] args) throws IOException {

    	ProfileCredentialsProvider credentials = new ProfileCredentialsProvider();

        client = new AmazonGlacierClient(credentials);
        client.setEndpoint("https://glacier.us-west-2.amazonaws.com/");

        try {
            System.out.println("Uploading an archive.");
            String uploadId = initiateMultipartUpload();
            String checksum = uploadParts(uploadId);
            String archiveId = CompleteMultiPartUpload(uploadId, checksum);
            System.out.println("Completed an archive. ArchiveId: " + archiveId);
            
        } catch (Exception e) {
            System.err.println(e);
        }

    }
    
    private static String initiateMultipartUpload() {
        // Initiate
        InitiateMultipartUploadRequest request = new InitiateMultipartUploadRequest()
            .withVaultName(vaultName)
            .withArchiveDescription("my archive " + (new Date()))
            .withPartSize(partSize);            
        
        InitiateMultipartUploadResult result = client.initiateMultipartUpload(request);
        
        System.out.println("ArchiveID: " + result.getUploadId());
        return result.getUploadId();
    }

    private static String uploadParts(String uploadId) throws AmazonServiceException, NoSuchAlgorithmException, AmazonClientException, IOException {

        int filePosition = 0;
        long currentPosition = 0;
        byte[] buffer = new byte[Integer.valueOf(partSize)];
        List<byte[]> binaryChecksums = new LinkedList<byte[]>();
        
        File file = new File(archiveFilePath);
        FileInputStream fileToUpload = new FileInputStream(file);
        String contentRange;
        int read = 0;
        while (currentPosition < file.length())
        {
            read = fileToUpload.read(buffer, filePosition, buffer.length);
            if (read == -1) { break; }
            byte[] bytesRead = Arrays.copyOf(buffer, read);

            contentRange = String.format("bytes %s-%s/*", currentPosition, currentPosition + read - 1);
            String checksum = TreeHashGenerator.calculateTreeHash(new ByteArrayInputStream(bytesRead));
            byte[] binaryChecksum = BinaryUtils.fromHex(checksum);
            binaryChecksums.add(binaryChecksum);
            System.out.println(contentRange);
                        
            //Upload part.
            UploadMultipartPartRequest partRequest = new UploadMultipartPartRequest()
            .withVaultName(vaultName)
            .withBody(new ByteArrayInputStream(bytesRead))
            .withChecksum(checksum)
            .withRange(contentRange)
            .withUploadId(uploadId);               
        
            UploadMultipartPartResult partResult = client.uploadMultipartPart(partRequest);
            System.out.println("Part uploaded, checksum: " + partResult.getChecksum());
            
            currentPosition = currentPosition + read;
        }
        fileToUpload.close();
        String checksum = TreeHashGenerator.calculateTreeHash(binaryChecksums);
        return checksum;
    }

    private static String CompleteMultiPartUpload(String uploadId, String checksum) throws NoSuchAlgorithmException, IOException {
        
        File file = new File(archiveFilePath);

        CompleteMultipartUploadRequest compRequest = new CompleteMultipartUploadRequest()
            .withVaultName(vaultName)
            .withUploadId(uploadId)
            .withChecksum(checksum)
            .withArchiveSize(String.valueOf(file.length()));
        
        CompleteMultipartUploadResult compResult = client.completeMultipartUpload(compRequest);
        return compResult.getLocation();
    }
}
```

# 使用 上傳大型封存 適用於 .NET 的 AWS SDK
<a name="uploading-an-archive-mpu-using-dotnet"></a>

適用於 .NET 的 Amazon 開發套件提供的[高階和低階 API](using-aws-sdk.md) 都提供了以部分形式上傳大型封存的方法 (請參閱[在 Amazon Glacier 中上傳封存](uploading-an-archive.md))。

 
+ 高階的 API 提供了一種可用來上傳任何大小的封存的方法。根據您上傳的檔案， 方法會在單一操作中上傳封存，或使用 Amazon Glacier (Amazon Glacier) 中的分段上傳支援來分段上傳封存。
+ 低階 API 對應接近底層 REST 實作。因此，它提供一個方法，在一個操作中上傳較小的封存，以及一組方法，可支援分段上傳以上傳較大封存。本節說明使用低階 API 以部分形式上傳大型封存。

如需高階和低階的 API 的更多資訊，請參閱 [適用於 .NET 的 AWS SDK 搭配 Amazon Glacier 使用](using-aws-sdk-for-dot-net.md)。

**Topics**
+ [使用 的高階 API 分段上傳大型封存 適用於 .NET 的 AWS SDK](#uploading-an-archive-in-parts-highlevel-using-dotnet)
+ [使用 的低階 API 分段上傳大型封存 適用於 .NET 的 AWS SDK](#uploading-an-archive-in-parts-lowlevel-using-dotnet)

## 使用 的高階 API 分段上傳大型封存 適用於 .NET 的 AWS SDK
<a name="uploading-an-archive-in-parts-highlevel-using-dotnet"></a>

您可以使用高階 API 的相同方法來上傳小型或大型封存。根據封存大小，高階 API 方法會決定在單一操作中上傳封存，還是使用 Amazon Glacier 提供的分段上傳 API。如需詳細資訊，請參閱[使用 的高階 API 上傳封存 適用於 .NET 的 AWS SDK](uploading-an-archive-single-op-using-dotnet.md#uploading-an-archive-single-op-highlevel-using-dotnet)。

## 使用 的低階 API 分段上傳大型封存 適用於 .NET 的 AWS SDK
<a name="uploading-an-archive-in-parts-lowlevel-using-dotnet"></a>

對於精細控制上傳，您可以使用低階 API，您可以設定請求和處理回應。以下是使用 適用於 .NET 的 AWS SDK以部分形式上傳大型封存的步驟。

 

1. 建立 `AmazonGlacierClient` 類別的執行個體 (用戶端)。

   您需要指定要儲存封存 AWS 的區域。您使用此用戶端執行的所有操作都會套用到該 AWS 區域。

1. 呼叫 `InitiateMultipartUpload` 方法以啟動分段上傳。

   您需要提供要上傳封存的保存庫名稱、要用於上傳封存部分的部分大小以及可選說明。您可以透過建立 `InitiateMultipartUploadRequest` 類別的執行個體，來提供這項資訊。在回應中，Amazon Glacier 會傳回上傳 ID。

1. 透過呼叫 `UploadMultipartPart` 方法上傳部分。

   對於您上載的每個部分，您需要提供文件庫名稱、在該部分中上傳的最終組合的存檔中的位元組範圍、部分資料的檢查總和和上傳 ID。

1. 呼叫 `CompleteMultipartUpload` 方法以計算分段上傳。

   您需要提供上傳 ID、整個封存的檢查總和、封存大小 (您上傳的所有部分的組合大小) 和保存庫名稱。Amazon Glacier 會從上傳的組件建構封存，並傳回封存 ID。

### 範例：使用適用於 .NET 的 Amazon 開發套件，以部分形式上傳大型封存
<a name="upload-archive-mpu-dotnet-example"></a>

下列 C\$1 程式碼範例使用 適用於 .NET 的 AWS SDK 將封存上傳至保存庫 (`examplevault`)。如需執行此範例的逐步說明，請參閱 [執行程式碼範例](using-aws-sdk-for-dot-net.md#setting-up-and-testing-sdk-dotnet)。您必須如所示，使用要上傳的檔案名稱更新程式碼。

**Example**  

```
using System;
using System.Collections.Generic;
using System.IO;
using Amazon.Glacier;
using Amazon.Glacier.Model;
using Amazon.Runtime;

namespace glacier.amazon.com.rproxy.govskope.us.docsamples
{
  class ArchiveUploadMPU
  {
    static string vaultName       = "examplevault";
    static string archiveToUpload = "*** Provide file name (with full path) to upload ***";
    static long partSize          = 4194304; // 4 MB.

    public static void Main(string[] args)
    {
      AmazonGlacierClient client;
      List<string> partChecksumList = new List<string>();
      try
      {
         using (client = new AmazonGlacierClient(Amazon.RegionEndpoint.USWest2)) 
        {
          Console.WriteLine("Uploading an archive.");
          string uploadId  = InitiateMultipartUpload(client);
          partChecksumList = UploadParts(uploadId, client);
          string archiveId = CompleteMPU(uploadId, client, partChecksumList);
          Console.WriteLine("Archive ID: {0}", archiveId);
        }
        Console.WriteLine("Operations successful. To continue, press Enter");
        Console.ReadKey();
      }
      catch (AmazonGlacierException e) { Console.WriteLine(e.Message); }
      catch (AmazonServiceException e) { Console.WriteLine(e.Message); }
      catch (Exception e) { Console.WriteLine(e.Message); }
      Console.WriteLine("To continue, press Enter");
      Console.ReadKey();
    }

    static string InitiateMultipartUpload(AmazonGlacierClient client)
    {
      InitiateMultipartUploadRequest initiateMPUrequest = new InitiateMultipartUploadRequest()
      {

        VaultName = vaultName,
        PartSize = partSize,
        ArchiveDescription = "Test doc uploaded using MPU."
      };

      InitiateMultipartUploadResponse initiateMPUresponse = client.InitiateMultipartUpload(initiateMPUrequest);

      return initiateMPUresponse.UploadId;
    }

    static List<string> UploadParts(string uploadID, AmazonGlacierClient client)
    {
      List<string> partChecksumList = new List<string>();
      long currentPosition = 0;
      var buffer = new byte[Convert.ToInt32(partSize)];

      long fileLength = new FileInfo(archiveToUpload).Length;
      using (FileStream fileToUpload = new FileStream(archiveToUpload, FileMode.Open, FileAccess.Read))
      {
        while (fileToUpload.Position < fileLength)
        {
          Stream uploadPartStream = GlacierUtils.CreatePartStream(fileToUpload, partSize);
          string checksum = TreeHashGenerator.CalculateTreeHash(uploadPartStream);
          partChecksumList.Add(checksum);
          // Upload part.
          UploadMultipartPartRequest uploadMPUrequest = new UploadMultipartPartRequest()
          {

            VaultName = vaultName,
            Body = uploadPartStream,
            Checksum = checksum,
            UploadId = uploadID
          };
          uploadMPUrequest.SetRange(currentPosition, currentPosition + uploadPartStream.Length - 1);
          client.UploadMultipartPart(uploadMPUrequest);

          currentPosition = currentPosition + uploadPartStream.Length;
        }
      }
      return partChecksumList;
    }

    static string CompleteMPU(string uploadID, AmazonGlacierClient client, List<string> partChecksumList)
    {
      long fileLength = new FileInfo(archiveToUpload).Length;
      CompleteMultipartUploadRequest completeMPUrequest = new CompleteMultipartUploadRequest()
      {
        UploadId = uploadID,
        ArchiveSize = fileLength.ToString(),
        Checksum = TreeHashGenerator.CalculateTreeHash(partChecksumList),
        VaultName = vaultName
      };

      CompleteMultipartUploadResponse completeMPUresponse = client.CompleteMultipartUpload(completeMPUrequest);
      return completeMPUresponse.ArchiveId;
    }
  }
}
```

# 使用 REST API 上傳分段中的大型封存
<a name="uploading-an-archive-mpu-using-rest"></a>

如[上傳分段中的大型封存 (分段上傳)](uploading-archive-mpu.md)中所述，分段上傳是指一組操作，可讓您分段上傳封存，並執行相關的操作。如需這些操作的詳細資訊，請參閱下列 API 參考主題：

 
+ [啟動分段上傳 (POST 分段 - 上傳)](api-multipart-initiate-upload.md)
+ [分段上傳 (PUT uploadID)](api-upload-part.md)
+ [完成分段上傳 (POST uploadID)](api-multipart-complete-upload.md)
+ [中止分段上傳 (DELETE uploadID)](api-multipart-abort-upload.md)
+ [清單部分 (GET uploadID)](api-multipart-list-parts.md)
+ [列出分段上傳 (GET 分段 - 上傳)](api-multipart-list-uploads.md)