

 **此頁面僅適用於使用 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/)

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

# 在 Amazon Glacier 中上傳封存
<a name="uploading-an-archive"></a>

Amazon Glacier (Amazon Glacier) 提供管理主控台，可用來建立和刪除保存庫。不過，您無法使用 管理主控台將封存上傳至 Amazon Glacier。若要上傳資料，例如相片、影片和其他文件，您必須直接使用 REST API AWS CLI 或使用 Amazon SDKs，使用 或編寫程式碼來提出請求。

如需有關搭配 使用 Amazon Glacier 的資訊 AWS CLI，請參閱 [AWS CLI Amazon Glacier 的參考](https://docs.aws.amazon.com/cli/latest/reference/glacier/index.html)。若要安裝 AWS CLI，請前往 [AWS Command Line Interface](https://aws.amazon.com/cli/)。下列**上傳**主題說明如何使用適用於 Java 的 Amazon 開發套件、適用於 .NET 的 Amazon 開發套件和 REST API 將封存上傳至 Amazon Glacier。

**Topics**
+ [將封存上傳至 Amazon Glacier 的選項](#uploading-an-archive-overview)
+ [在單一操作中上傳封存](uploading-archive-single-operation.md)
+ [上傳分段中的大型封存 (分段上傳)](uploading-archive-mpu.md)

## 將封存上傳至 Amazon Glacier 的選項
<a name="uploading-an-archive-overview"></a>

視您上傳的資料大小而定，Amazon Glacier 會提供下列選項：
+ **在單一作業中上傳封存**：在單一作業中，您可以上傳大小為 1 位元組到最大 4 GB 的封存。不過，我們鼓勵 Amazon Glacier 客戶使用分段上傳來上傳大於 100 MB 的封存。如需詳細資訊，請參閱[在單一操作中上傳封存](uploading-archive-single-operation.md)。
+ **上傳部分封存** - 使用分段上傳 API，您可以上傳大型封存，最高可達 40,000 GB (10,000\$1 4 GB)。

  分段上傳 API 呼叫是專為改善較大型封存上傳體驗所設計。您可以分段上傳封存。這些封存部分可個別、依任何順序以及同時上傳。如果某個部分上傳失敗，您只需要再次上傳該部分，而不是整個封存。您可以為大小介於 1 位元組到 40,000 GB 之間的封存使用分段上傳。如需詳細資訊，請參閱[上傳分段中的大型封存 (分段上傳)](uploading-archive-mpu.md)。

**重要**  
Amazon Glacier 保存庫庫存每天只會更新一次。當上傳封存時，您將不會立即看到新增到文件庫的新存檔 (在主控台中或在下載的文件庫清查清單中)，直到文件庫清查已更新。

### 使用 AWS Snowball Edge 服務
<a name="using-import-export-service-for-glacier"></a>

AWS Snowball Edge 加速 AWS 使用 Amazon 擁有的裝置進出大量資料，繞過網際網路。如需詳細資訊，請參閱 [AWS Snowball Edge](https://aws.amazon.com/snowball) 的詳細資訊頁面。

若要將現有資料上傳至 Amazon Glacier (Amazon Glacier)，您可以考慮使用其中一種 AWS Snowball Edge 裝置類型將資料匯入 Amazon S3，然後使用生命週期規則將其移至 Amazon Glacier 儲存類別以進行封存。當您將 Amazon S3 物件轉換為 Amazon Glacier 儲存類別時，Amazon S3 會在內部使用 Amazon Glacier 以較低成本提供耐久儲存。雖然物件存放在 Amazon Glacier 中，他們會保有您在 Amazon S3 中管理的 Amazon S3 物件，且您無法透過 Amazon Glacier 直接存取。

如需 Amazon S3 生命週期組態和將物件轉換為 Amazon Glacier 儲存類別的詳細資訊，請參閱《*Amazon Simple Storage Service 使用者指南*》中的[物件生命週期管理和](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lifecycle-mgmt.html)[轉換物件](https://docs.aws.amazon.com/AmazonS3/latest/userguide/lifecycle-transition-general-considerations.html)。

# 在單一操作中上傳封存
<a name="uploading-archive-single-operation"></a>

如 [在 Amazon Glacier 中上傳封存](uploading-an-archive.md) 中所述，您可以在單一操作中上傳較小的封存。不過，我們鼓勵 Amazon Glacier (Amazon Glacier) 客戶使用分段上傳上傳大於 100 MB 的封存。

**Topics**
+ [使用 在單一操作中上傳封存 AWS Command Line Interface](uploading-an-archive-single-op-using-cli.md)
+ [使用 在單一操作中上傳封存 適用於 Java 的 AWS SDK](uploading-an-archive-single-op-using-java.md)
+ [在 Amazon Glacier 中使用 在單一操作 適用於 .NET 的 AWS SDK 中上傳封存](uploading-an-archive-single-op-using-dotnet.md)
+ [使用 REST API 在單一操作中上傳封存](uploading-an-archive-single-op-using-rest.md)

# 使用 在單一操作中上傳封存 AWS Command Line Interface
<a name="uploading-an-archive-single-op-using-cli"></a>

您可以使用 AWS Command Line Interface () 在 Amazon Glacier (Amazon Glacier) 中上傳封存AWS CLI。

**Topics**
+ [（先決條件） 設定 AWS CLI](#Creating-Vaults-CLI-Setup)
+ [範例：使用 上傳封存 AWS CLI](#Uploading-Archives-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
     ```

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

若要上傳封存，您必須建立保存庫。如需有關建立保存庫的詳細資訊，請參閱[在 Amazon Glacier 中建立保存庫](creating-vaults.md)。

1. 使用 `upload-archive` 命令將封存新增至現有保存庫。在下面的範例中替換 `vault name` 和 `account ID`。對於 `body` 參數，指定您要上傳之檔案的路徑。

   ```
   aws glacier upload-archive --vault-name awsexamplevault --account-id 123456789012 --body archive.zip
   ```

1.  預期的輸出結果：

   ```
   {
       "archiveId": "kKB7ymWJVpPSwhGP6ycSOAekp9ZYe_--zM_mw6k76ZFGEIWQX-ybtRDvc2VkPSDtfKmQrj0IRQLSGsNuDp-AJVlu2ccmDSyDUmZwKbwbpAdGATGDiB3hHO0bjbGehXTcApVud_wyDw",
       "checksum": "969fb39823836d81f0cc028195fcdbcbbe76cdde932d4646fa7de5f21e18aa67",
       "location": "/123456789012/vaults/awsexamplevault/archives/kKB7ymWJVpPSwhGP6ycSOAekp9ZYe_--zM_mw6k76ZFGEIWQX-ybtRDvc2VkPSDtfKmQrj0IRQLSGsNuDp-AJVlu2ccmDSyDUmZwKbwbpAdGATGDiB3hHO0bjbGehXTcApVud_wyDw"
   }
   ```

   完成時，命令將輸出 Amazon Glacier 中的封存 ID、檢查總和和和位置。如需有關 upload-archive 命令的詳細資訊，請參閱《AWS CLI 命令參考》**中的 [upload-archive](https://docs.aws.amazon.com/cli/latest/reference/glacier/upload-archive.html)。

# 使用 在單一操作中上傳封存 適用於 Java 的 AWS SDK
<a name="uploading-an-archive-single-op-using-java"></a>

適用於 Java 的 Amazon 開發套件提供的[高階和低階 API](using-aws-sdk.md) 都提供了上傳封存的方法。

**Topics**
+ [使用 的高階 API 上傳封存 適用於 Java 的 AWS SDK](#uploading-an-archive-single-op-high-level-using-java)
+ [使用 的低階 API 在單一操作中上傳封存 適用於 Java 的 AWS SDK](#uploading-an-archive-single-op-low-level-using-java)

## 使用 的高階 API 上傳封存 適用於 Java 的 AWS SDK
<a name="uploading-an-archive-single-op-high-level-using-java"></a>

高階 API 的 `ArchiveTransferManager` 類別提供 `upload` 方法，可以使用該方法將存檔上傳到文件庫。

 

**注意**  
您可以使用 `upload` 方法上傳小型或大型封存。根據您要上傳的封存大小，此方法會判斷在單一操作上傳，或使用分段上傳 API 將封存分成部分上傳。

### 範例：使用 的高階 API 上傳封存 適用於 Java 的 AWS SDK
<a name="upload-archive-high-level-java-example"></a>

以下 Java 程式碼範例將封存上傳到美國西部 (奧勒岡) 區域 (`us-west-2`) 中的保存庫 (`examplevault`)。如需支援 AWS 的區域和端點清單，請參閱 [存取 Amazon Glacier](amazon-glacier-accessing.md)。

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

**Example**  

```
import java.io.File;
import java.io.IOException;
import java.util.Date;

import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.services.glacier.AmazonGlacierClient;
import com.amazonaws.services.glacier.transfer.ArchiveTransferManager;
import com.amazonaws.services.glacier.transfer.UploadResult;


public class ArchiveUploadHighLevel {
    public static String vaultName = "*** provide vault name ***";
    public static String archiveToUpload = "*** provide name of file to upload ***";
    
    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 {
            ArchiveTransferManager atm = new ArchiveTransferManager(client, credentials);
            
            UploadResult result = atm.upload(vaultName, "my archive " + (new Date()), new File(archiveToUpload));
            System.out.println("Archive ID: " + result.getArchiveId());
            
        } catch (Exception e)
        {
            System.err.println(e);
        }
    }
}
```

## 使用 的低階 API 在單一操作中上傳封存 適用於 Java 的 AWS SDK
<a name="uploading-an-archive-single-op-low-level-using-java"></a>

低階 API 提供所有封存操作的方法。以下是使用 適用於 Java 的 AWS SDK上傳封存的步驟。

 

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

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

1. 您可以透過建立 `UploadArchiveRequest` 類別的執行個體來提供請求資訊。

   除了要上傳的資料外，還需要提供承載的檢查總和 (SHA-256 樹狀雜湊)、保存庫名稱、資料的內容長度和帳戶 ID。

   如果您不提供帳戶 ID，則會使用與您提供來簽署請求之登入資料關聯的帳戶 ID。如需詳細資訊，請參閱[適用於 Java 的 AWS SDK 搭配 Amazon Glacier 使用](using-aws-sdk-for-java.md)。

1. 以參數形式提供請求物件，以便執行 `uploadArchive` 方法。

   為了回應，Amazon Glacier (Amazon Glacier) 會傳回新上傳封存的封存 ID。

下列 Java 程式碼片段描述前述步驟。

```
AmazonGlacierClient client;

UploadArchiveRequest request = new UploadArchiveRequest()
    .withVaultName("*** provide vault name ***")
    .withChecksum(checksum)
    .withBody(new ByteArrayInputStream(body))
    .withContentLength((long)body.length);

UploadArchiveResult uploadArchiveResult = client.uploadArchive(request);

System.out.println("Location (includes ArchiveID): " + uploadArchiveResult.getLocation());
```

### 範例：使用 的低階 API 在單一操作中上傳封存 適用於 Java 的 AWS SDK
<a name="uploding-single-archive-using-java-example"></a>

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

```
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.services.glacier.AmazonGlacierClient;
import com.amazonaws.services.glacier.TreeHashGenerator;
import com.amazonaws.services.glacier.model.UploadArchiveRequest;
import com.amazonaws.services.glacier.model.UploadArchiveResult;
public class ArchiveUploadLowLevel {

    public static String vaultName = "*** provide vault name ****";
    public static String archiveFilePath = "*** provide to file upload ****";
    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-east-1.amazonaws.com/");

        try {
            // First open file and read.
            File file = new File(archiveFilePath);
            InputStream is = new FileInputStream(file); 
            byte[] body = new byte[(int) file.length()];
            is.read(body);
                                    
            // Send request.
            UploadArchiveRequest request = new UploadArchiveRequest()
                .withVaultName(vaultName)
                .withChecksum(TreeHashGenerator.calculateTreeHash(new File(archiveFilePath))) 
                .withBody(new ByteArrayInputStream(body))
                .withContentLength((long)body.length);
            
            UploadArchiveResult uploadArchiveResult = client.uploadArchive(request);
            
            System.out.println("ArchiveID: " + uploadArchiveResult.getArchiveId());
            
        } catch (Exception e)
        {
            System.err.println("Archive not uploaded.");
            System.err.println(e);
        }
    }
}
```

# 在 Amazon Glacier 中使用 在單一操作 適用於 .NET 的 AWS SDK 中上傳封存
<a name="uploading-an-archive-single-op-using-dotnet"></a>

適用於 .NET 的 Amazon 開發套件提供的[高階和低階 API](using-aws-sdk.md) 都提供了在單一作業中上傳封存的方法。

**Topics**
+ [使用 的高階 API 上傳封存 適用於 .NET 的 AWS SDK](#uploading-an-archive-single-op-highlevel-using-dotnet)
+ [使用 的低階 API 在單一操作中上傳封存 適用於 .NET 的 AWS SDK](#uploading-an-archive-single-op-lowlevel-using-dotnet)

## 使用 的高階 API 上傳封存 適用於 .NET 的 AWS SDK
<a name="uploading-an-archive-single-op-highlevel-using-dotnet"></a>

高階 API 的 `ArchiveTransferManager` 類別提供 `Upload` 方法，您可以使用該方法將存檔上傳到文件庫。

**注意**  
您可以使用 `Upload` 方法上傳小型或大型檔案。根據您要上傳的檔案大小，此方法會判斷在單一操作上傳，或使用分段上傳 API 以將檔案分段上傳。

### 範例：使用 的高階 API 上傳封存 適用於 .NET 的 AWS SDK
<a name="upload-archive-highlevel-any-size-dotnet"></a>

以下 C\$1 程式碼範例將封存上傳到美國西部 (奧勒岡) 區域中的保存庫 (`examplevault`)。

如需執行此範例的逐步說明，請參閱 [執行程式碼範例](using-aws-sdk-for-dot-net.md#setting-up-and-testing-sdk-dotnet)。您必須如所示，使用要上傳的檔案名稱更新程式碼。

**Example**  

```
using System;
using Amazon.Glacier;
using Amazon.Glacier.Transfer;
using Amazon.Runtime;

namespace glacier.amazon.com.rproxy.govskope.us.docsamples
{
  class ArchiveUploadHighLevel
  {
    static string vaultName = "examplevault"; 
    static string archiveToUpload = "*** Provide file name (with full path) to upload ***";

    public static void Main(string[] args)
    {
       try
      {
         var manager = new ArchiveTransferManager(Amazon.RegionEndpoint.USWest2);
         // Upload an archive.
         string archiveId = manager.Upload(vaultName, "upload archive test", archiveToUpload).ArchiveId;
         Console.WriteLine("Archive ID: (Copy and save this ID for use in other examples.) : {0}", archiveId);
         Console.WriteLine("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();
    }
  }
}
```

## 使用 的低階 API 在單一操作中上傳封存 適用於 .NET 的 AWS SDK
<a name="uploading-an-archive-single-op-lowlevel-using-dotnet"></a>

低階 API 提供所有封存操作的方法。以下是使用 適用於 .NET 的 AWS SDK上傳封存的步驟。

 

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

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

1. 您可以透過建立 `UploadArchiveRequest` 類別的執行個體來提供請求資訊。

   除了要上傳的資料外，還需要提供承載的檢查總和 (SHA-256 樹狀雜湊)、保存庫名稱和帳戶 ID。

   如果您不提供帳戶 ID，則會使用與您提供來簽署請求之登入資料關聯的帳戶 ID。如需詳細資訊，請參閱[適用於 .NET 的 AWS SDK 搭配 Amazon Glacier 使用](using-aws-sdk-for-dot-net.md)。

1. 以參數形式提供請求物件，以便執行 `UploadArchive` 方法。

   為了回應，Amazon Glacier 會傳回新上傳封存的封存 ID。

### 範例：使用 的低階 API 在單一操作中上傳封存 適用於 .NET 的 AWS SDK
<a name="upload-archive-single-op-lowlevel-dotnet"></a>

下列 C\$1 程式碼範例描述前述步驟。此範例使用 適用於 .NET 的 AWS SDK 將封存上傳至保存庫 (`examplevault`)。

**注意**  
如需有關底層 REST API 在單一請求中上傳封存的詳細資訊，請參閱 [上傳封存 (POST 封存)](api-archive-post.md)。

如需執行此範例的逐步說明，請參閱 [執行程式碼範例](using-aws-sdk-for-dot-net.md#setting-up-and-testing-sdk-dotnet)。您必須如所示，使用要上傳的檔案名稱更新程式碼。

**Example**  

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

namespace glacier.amazon.com.rproxy.govskope.us.docsamples
{
  class ArchiveUploadSingleOpLowLevel
  {
    static string vaultName       = "examplevault";
    static string archiveToUpload = "*** Provide file name (with full path) to upload ***";

    public static void Main(string[] args)
    {
      AmazonGlacierClient client;
      try
      {
         using (client = new AmazonGlacierClient(Amazon.RegionEndpoint.USWest2))
        {
          Console.WriteLine("Uploading an archive.");
          string archiveId = UploadAnArchive(client);
          Console.WriteLine("Archive ID: {0}", archiveId);
        }
      }
      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 UploadAnArchive(AmazonGlacierClient client)
    {
      using (FileStream fileStream = new FileStream(archiveToUpload, FileMode.Open, FileAccess.Read))
      {
        string treeHash = TreeHashGenerator.CalculateTreeHash(fileStream);
        UploadArchiveRequest request = new UploadArchiveRequest()
        {
          VaultName = vaultName,
          Body = fileStream,
          Checksum = treeHash
        };
        UploadArchiveResponse response = client.UploadArchive(request);
        string archiveID = response.ArchiveId;
        return archiveID;
      }
    }
  }
}
```

# 使用 REST API 在單一操作中上傳封存
<a name="uploading-an-archive-single-op-using-rest"></a>

您可以使用上傳封存 API 呼叫以在單一操作中上傳封存。如需詳細資訊，請參閱[上傳封存 (POST 封存)](api-archive-post.md)。

# 上傳分段中的大型封存 (分段上傳)
<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)