

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 通过分段上传将文件上传到 Lightsail 存储桶
<a name="amazon-lightsail-uploading-files-to-a-bucket-using-multipart-upload"></a>

通过分段上传，可将单个文件作为一组分段上传到存储桶。每个分段都是文件数据的连续部分。您可以独立上传以及按任意顺序上传这些文件分段。如果任意分段传输失败，可以重新传输该分段且不会影响其它分段。文件的所有部分都上传完毕后，Amazon S3 会汇编这些部分，然后在 Amazon Lightsail 的存储桶中创建对象。一般而言，如果您的对象大小达到了 100 MB，您应该考虑使用分段上传，而不是在单个操作中上传对象。有关存储桶的更多信息，请参阅[对象存储](buckets-in-amazon-lightsail.md)。

使用分段上传可提供以下优势：
+ 提高吞吐量 – 您可以并行上传分段以提高吞吐量。
+ 从任何网络问题中快速恢复 - 较小的分段大小可以将由于网络错误而需重启失败的上传所产生的影响降至最低。
+ 逐步上传 — 您可以在一段时间内逐步上传文件分段。启动分段上传后，您可以在 24 小时内完成分段上传。
+ 在您知道最终文件大小前开始上传 – 您可以在创建对象时将其上传。

我们建议您按以下方式使用分段上传：
+ 如果您在稳定的高带宽网络上传大文件，通过并行上传文件分段进行多线程上传，分段上传可以充分利用您的可用带宽。
+ 如果您在断点网络中上传对象，请使用分段上传以提高应对网络错误的复原能力，从而避免重新上传。在使用分段上传时，您只需重新尝试上传中断的分段即可。无需重头开始或重新上传整个文件。

**内容**
+ [分段上传流程](#mutipart-upload-process)
+ [并发分段上传操作](#concurrent-multipart-upload-operations)
+ [分段上传保留](#multipart-upload-retention)
+ [Amazon Simple Storage Service 分段上传限制](#multipart-upload-limits)
+ [拆分要上传的文件](#split-the-file-to-upload)
+ [使用启动分段上传 AWS CLI](#initiate-multipart-upload)
+ [使用上传分段 AWS CLI](#upload-a-part)
+ [使用列出分段上传的各个部分 AWS CLI](#list-parts-of-multipart-upload)
+ [创建分段上传 .json 文件](#create-multipart-upload-json-file)
+ [使用完成分段上传 AWS CLI](#complete-multipart-upload)
+ [使用列出存储桶的分段上传 AWS CLI](#list-multipart-uploads)
+ [使用 AWS CLI停止分段上传](#stop-multipart-uploads)

## 分段上传流程
<a name="mutipart-upload-process"></a>

分段上传是一个三步过程，它使用 Amazon S3 操作将文件上传到 Lightsail 中的存储桶：

1. 您可以使用[CreateMultipartUpload](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateMultipartUpload.html)操作启动分段上传。

1. 您可以使用[UploadPart](https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPart.html)操作上传文件片段。

1. 您可以使用[CompleteMultipartUpload](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html)操作完成分段上传。

**注意**  
在启动分段上传后，您可以使用[AbortMultipartUpload](https://docs.aws.amazon.com/AmazonS3/latest/API/API_AbortMultipartUpload.html)操作停止分段上传。

分段上传请求完成后，Amazon Simple Storage Service 将根据上传的分段构建对象。然后，您可以按照访问存储桶中任何其他对象的方式访问该对象。

您可以列出所有正在执行的分段上传，或者获取为特定分段上传操作上传的分段列表。以上每个操作都在本节中进行了说明。

**分段上传开始**

当您发送请求以开始分段上传时，Amazon Simple Storage Service 将返回具有上传 ID 的响应。这是分段上传的唯一标识符。无论您何时上传分段、列出分段、完成上传或停止上传，您都必须包括此上传 ID。如果您想要提供描述已上传的对象的任何元数据，必须在请求中指定元数据以开始分段上传。

**分段上传**

上传分段时，除了指定上传 ID，还必须指定分段编号。您可以选择 1 和 10000 之间的任意分段编号。分段编号在您正在上传的对象中唯一地识别分段及其位置。您选择的分段编号不必是连续序列（例如，它可以是 1、5 和 14）。如果您使用之前上传的分段的同一分段编号上传新分段，则之前上传的分段将被覆盖。

每当您上传分段时，Amazon Simple Storage Service 都会在其响应中返回ETag标头。对于每个分段上传，您都必须记录分段编号和 ETag 值。您必须在随后的请求中包括这些值以完成分段上传。

**注意**  
分段上传的所有上传分段都会存储在您的存储桶中。它们会占用存储桶的存储空间，直到您完成上传、停止上传或上传超时。有关更多信息，请参阅 [分段上传保留](#multipart-upload-retention)本指南下文中的。

**分段上传完成**

完成分段上传后，Amazon Simple Storage Service 会根据分段编号按升序连接各分段，而从创建对象。如果在开始分段上传请求中提供了任何对象元数据，则 Amazon Simple Storage Service 会将该元数据与对象相关联。成功完成请求后，分段将不再存在。

您完整的分段上传请求必须包含上传 ID 以及分段编号和相应 ETag 值的列表。Amazon 简单存储服务响应包括 ETag 唯一标识组合对象数据的。这不一定 ETag 是对象数据的 MD5 哈希值。

您可以选择停止分段上传。停止分段上传后，无法再次使用该上传 ID 上传任何分段。然后，释放取消的分段上传的任何分段的所有存储空间。如果有任何分段上传正在进行，则即使在您停止后，它们仍然可能会成功或失败。要释放所有分段使用的所有存储，必须仅在完成所有分段的上传后才停止分段上传。

**分段上传列表**

您可以列出特定分段上传或所有正在进行的分段上传的分段。列出分段操作将返回您已为特定分段上传而上传的分段信息。对于每个列表分段请求，Amazon Simple Storage Service 将返回有关特定分段上传的分段信息，最多为 1000 个分段。如果分段上传中的分段超过 1000 个，您必须发送一系列列出分段请求以检索所有分段。请注意，返回的分段列表不包括仍在上传的分段。使用“列出分段上传”操作，您可以获得正在进行的分段上传的列表。

正在进行的分段上传是已开始但还未完成或停止的上传。每个请求将返回最多 1000 个分段上传。如果正在进行的分段上传超过 1000 个，您必须发送其他请求才能检索剩余的分段上传。仅使用返回的列表进行验证。发送“完成分段上传”请求时，请勿使用此列表的结果。相反，请保留您自己的列表，列出您在上传分段时指定的分段编号以及 Amazon Simple Storage Service 返回的相应 ETag 值。

## 并发分段上传操作
<a name="concurrent-multipart-upload-operations"></a>

在分布式开发环境中，您的应用程序可以同时在同一对象上开始多个更新。您的应用程序可能会使用同一对象键开始多个分段上传。然后，对于其中的每个上传，您的应用程序可以上传分段并将完成上传的请求发送到 Amazon Simple Storage Service，以创建数据元。当存储桶启用了版本控制时，完成分段上传将始终创建一个新版本。对于未启用版本控制的存储桶，其他请求可能会优先开始，例如在开始分段上传和完成分段上传之前收到的请求。

**注意**  
可能会优先考虑其他请求，例如在开始分段上传之后和完成之前收到的请求。例如，使用键开始分段上传之后，其他操作可能会在完成分段上传之前删除该键。如果发生这种情况，则完成分段上传的响应可能表示在未看到对象的情况下成功创建了对象。

## 分段上传保留
<a name="multipart-upload-retention"></a>

分段上传的所有上传分段都会存储在您的存储桶中。它们会占用存储桶的存储空间，直到您完成上传、停止上传或上传超时。分段上传超时，分段上传将在创建后 24 小时后删除。若您停止分段上传或分段上传超时，所有上传的分段都将被删除，并释放它们在存储桶上占用的存储空间。

## Amazon Simple Storage Service 分段上传限制
<a name="multipart-upload-limits"></a>

下表提供了分段上传的核心规范。
+ 最大对象大小：50 TB
+ 每次上传的最大分段数量：10000 个
+ 分段编号：1-10000（含）
+ 分段大小：5 MB（最小值）- 5 GB（最大值）。未对分段上传的最后一段施加大小限制。
+ “列出分段”请求返回的最大分段数量：1,000
+ “列出分段上传”请求返回的最大分段上传数量：1,000

## 拆分要上传的文件
<a name="split-the-file-to-upload"></a>

在 Linux 或 Linux 操作系统中使用 `split` 命令可以将文件拆分为多个分段，然后将其上传到存储桶。您可以在 Windows 操作系统中使用类似的免费软件应用程序来拆分文件。将文件拆分为多个部分后，继续执行本指南的[启动分段上传](#initiate-multipart-upload)部分。

## 使用启动分段上传 AWS CLI
<a name="initiate-multipart-upload"></a>

完成以下过程，以使用 AWS Command Line Interface （AWS CLI）启动分段上传。使用 `create-multipart-upload` 命令完成此操作。有关更多信息，请参阅《*AWS CLI 命令参考*》[create-multipart-upload](https://docs.aws.amazon.com/cli/latest/reference/s3api/create-multipart-upload.html)中的。

**注意**  
在 AWS CLI 继续执行此过程之前，您必须为 Lightsail 和 Amazon S3 安装并对其进行配置。有关更多信息，请参阅[配置为与 Lightsail 配合使用](lightsail-how-to-set-up-and-configure-aws-cli.md)。 AWS CLI 

1. 打开命令提示符或终端窗口。

1. 输入以下命令以为存储桶创建分段上传。

   ```
   aws s3api create-multipart-upload --bucket BucketName --key ObjectKey --acl bucket-owner-full-control
   ```

   在该命令中，将以下示例文本替换为自己的文本：
   + *BucketName*-您要为其创建分段上传的存储桶的名称。
   + *ObjectKey*-用于要上传的文件的对象密钥。

   示例：

   ```
   aws s3api create-multipart-upload --bucket amzn-s3-demo-bucket --key sailbot.mp4 --acl bucket-owner-full-control
   ```

   您应看到类似于以下示例的结果。响应包括一个 `UploadID`，您必须在随后的命令中指定，才能上传分段以及完成此对象的分段上传。  
![\[create-multipart-upload命令的结果\]](http://docs.aws.amazon.com/zh_cn/lightsail/latest/userguide/images/amazon-lightsail-s3api-create-multipart-upload-result.png)

   在拥有分段上传的 `UploadID` 之后，请继续执行本指南的以下[使用 AWS CLI上传分段](#upload-a-part)部分，然后开始上传分段。

## 使用上传分段 AWS CLI
<a name="upload-a-part"></a>

完成以下过程，以使用 AWS Command Line Interface （AWS CLI）上传分段上传的分段。使用 `upload-part` 命令完成此操作。有关更多信息，请参阅《AWS CLI Command Reference》**中的 [upload-part](https://docs.aws.amazon.com/cli/latest/reference/s3api/upload-part.html)。

**注意**  
在 AWS CLI 继续执行此过程之前，您必须为 Lightsail 和 Amazon S3 安装并对其进行配置。有关更多信息，请参阅[配置为与 Lightsail 配合使用](lightsail-how-to-set-up-and-configure-aws-cli.md)。 AWS CLI 

1. 打开命令提示符或终端窗口。

1. 输入以下命令以将分段上传到存储桶。

   ```
   aws s3api upload-part --bucket BucketName --key ObjectKey --part-number Number --body FilePart --upload-id "UploadID"  --acl bucket-owner-full-control
   ```

   在该命令中，将以下示例文本替换为自己的文本：
   + *BucketName*-您要为其创建分段上传的存储桶的名称。
   + *ObjectKey*-用于要上传的文件的对象密钥。
   + *Number*-您正在上传的分段的部件号。分段编号在您正在上传的对象中唯一地识别分段及其位置。请确保每次上传分段时，以递增方式增加 `--part-number` 参数。为此，请按照完成分段上传时 Amazon Simple Storage Service 组装对象的顺序来对其进行编号。
   + *FilePart*-要从您的计算机上传的零件文件。
   + *UploadID*-您在本指南前面部分创建的分段上传的上传 ID。

   示例：

   ```
   aws s3api upload-part --bucket amzn-s3-demo-bucket --key sailbot.mp4 --part-number 1 --body sailbot.mp4.001 --upload-id "R4QU.mO.exampleiHWiLOeNw7JtXX7OotRhTLsXXCzF21CZdYlfj5lfjtiMnpzVw2WPj.exampleBTmL_N_.42.DlHYOTsITFsX.tO3XOUTTAHiCxY5VR8jWRGdkVkUG" --acl bucket-owner-full-control
   ```

   您应看到类似于以下示例的结果。对每个上传的分段重复 `upload-part` 命令。每个上传分段请求的响应将包括已上传分段的 `ETag` 值。记录您上传的每个分段的 `ETag` 值。您将需要所有的 `ETag` 值来完成分段上传，之后这将在本指南中进行介绍。  
![\[upload-part 命令的结果\]](http://docs.aws.amazon.com/zh_cn/lightsail/latest/userguide/images/amazon-lightsail-s3api-upload-part-result.png)

## 使用 Amazon CLI 列出分段上传的分段
<a name="list-parts-of-multipart-upload"></a>

完成以下过程，以使用 AWS Command Line Interface （AWS CLI）列出分段上传的分段。使用 `list-parts` 命令完成此操作。有关更多信息，请参阅《AWS CLI Command Reference》**中的 [list-parts](https://docs.aws.amazon.com/cli/latest/reference/s3api/list-parts.html)。

完成此过程以获取分段上传中所有已上传分段的 `ETag` 值。您将需要这些值来完成分段上传，之后这将在本指南中进行介绍。但是，如果您记录了分段上传响应中的 `ETag` 值，则可以跳过此过程并继续执行本指南的[创建分段上传 .json 文件](#create-multipart-upload-json-file)部分。

**注意**  
在 AWS CLI 继续执行此过程之前，您必须为 Lightsail 和 Amazon S3 安装并对其进行配置。有关更多信息，请参阅[配置为与 Lightsail 配合使用](lightsail-how-to-set-up-and-configure-aws-cli.md)。 AWS CLI 

1. 打开命令提示符或终端窗口。

1. 输入以下命令以列出存储桶中分段上传的分段。

   ```
   aws s3api list-parts --bucket BucketName --key ObjectKey --upload-id "UploadID"
   ```

   在该命令中，将以下示例文本替换为自己的文本：
   + *BucketName*-您要列出分段上传的各个部分的存储桶的名称。
   + *ObjectKey*-分段上传的对象密钥。
   + *UploadID*-您在本指南前面部分创建的分段上传的上传 ID。

   示例：

   ```
   aws s3api list-parts --bucket amzn-s3-demo-bucket --key sailbot.mp4 --upload-id "R4QU.mO.exampleiHWiLOeNw7JtXX7OotRhTLsXXCzF21CZdYlfj5lfjtiMnpzVw2WPj.exampleBTmL_N_.42.DlHYOTsITFsX.tO3XOUTTAHiCxY5VR8jWRGdkVkUG"
   ```

   您应看到类似于以下示例的结果。响应列出了所有分段编号和您在分段上传中上传的分段的 `ETag` 值。将这些值复制到剪贴板，然后继续执行本指南的[创建分段上传 .json](#create-multipart-upload-json-file) 部分。  
![\[list-parts 命令的结果\]](http://docs.aws.amazon.com/zh_cn/lightsail/latest/userguide/images/amazon-lightsail-s3api-list-parts-result.png)

## 创建分段上传 .json 文件
<a name="create-multipart-upload-json-file"></a>

完成以下步骤以创建分段上传 .json 文件，该文件定义您上传的所有分段及其 `ETag` 值。之后在本指南中需要该文件才能完成分段上传。

1. 打开文本编辑器， 将在本指南的上一部分中请求的 `list-parts` 命令的响应粘贴在其中。

   结果应该类似以下示例。  
![\[分段上传 JSON 文件编号 1\]](http://docs.aws.amazon.com/zh_cn/lightsail/latest/userguide/images/amazon-lightsail-multipart-upload-json-file-1.png)

1. 重新格式化文本文件，如以下示例所示：  
![\[分段上传 JSON 文件编号 2\]](http://docs.aws.amazon.com/zh_cn/lightsail/latest/userguide/images/amazon-lightsail-multipart-upload-json-file-2.png)

1. 将文本文件作为 `mpstructure.json` 保存到计算机，然后继续执行本指南的[使用 Amazon CLI 完成分段上传](#complete-multipart-upload)部分。

## 使用 Amazon CLI 完成分段上传
<a name="complete-multipart-upload"></a>

完成以下过程，以使用 AWS Command Line Interface （AWS CLI）完成分段上传。使用 `complete-multipart-upload` 命令完成此操作。有关更多信息，请参阅《*AWS CLI 命令参考*》[complete-multipart-upload](https://docs.aws.amazon.com/cli/latest/reference/s3api/complete-multipart-upload.html)中的。

**注意**  
在 AWS CLI 继续执行此过程之前，您必须为 Lightsail 和 Amazon S3 安装并对其进行配置。有关更多信息，请参阅[配置为与 Lightsail 配合使用](lightsail-how-to-set-up-and-configure-aws-cli.md)。 AWS CLI 

1. 打开命令提示符或终端窗口。

1. 输入以下命令以将分段上传到存储桶。

   ```
   aws s3api complete-multipart-upload --multipart-upload file://JSONFileName --bucket BucketName --key ObjectKey --upload-id "UploadID"  --acl bucket-owner-full-control
   ```

   在该命令中，将以下示例文本替换为自己的文本：
   + *JSONFileName*-您在本指南前面部分创建的.json 文件的名称（例如，`mpstructure.json`）。
   + *BucketName*-您要为其完成分段上传的存储桶的名称。
   + *ObjectKey*-分段上传的对象密钥。
   + *UploadID*-您在本指南前面部分创建的分段上传的上传 ID。

   ```
   aws s3api complete-multipart-upload --multipart-upload file://mpstructure.json --bucket amzn-s3-demo-bucket --key sailbot.mp4 --upload-id "R4QU.mO.exampleiHWiLOeNw7JtXX7OotRhTLsXXCzF21CZdYlfj5lfjtiMnpzVw2WPj.exampleBTmL_N_.42.DlHYOTsITFsX.tO3XOUTTAHiCxY5VR8jWRGdkVkUG" --acl bucket-owner-full-control
   ```

   您应看到类似于以下示例的响应。这确认分段上传已完成。现在，可在存储桶中组装并提供该对象。  
![\[complete-multipart-upload命令的结果\]](http://docs.aws.amazon.com/zh_cn/lightsail/latest/userguide/images/amazon-lightsail-s3api-complete-multipart-upload-result.png)

## 使用 Amazon CLI 列出存储桶分段上传
<a name="list-multipart-uploads"></a>

完成以下过程，以使用 AWS Command Line Interface （AWS CLI）列出存储桶所有的分段上传。使用 `list-multipart-uploads` 命令完成此操作。有关更多信息，请参阅《*AWS CLI 命令参考*》[list-multipart-uploads](https://docs.aws.amazon.com/cli/latest/reference/s3api/list-multipart-uploads.html)中的。

**注意**  
在 AWS CLI 继续执行此过程之前，您必须为 Lightsail 和 Amazon S3 安装并对其进行配置。有关更多信息，请参阅[配置为与 Lightsail 配合使用](lightsail-how-to-set-up-and-configure-aws-cli.md)。 AWS CLI 

1. 打开命令提示符或终端窗口。

1. 输入以下命令以将分段上传到存储桶。

   ```
   aws s3api list-multipart-uploads --bucket BucketName
   ```

   在命令中，*BucketName*替换为要列出其所有分段上传的存储桶的名称。

   示例：

   ```
   aws s3api list-multipart-uploads --bucket amzn-s3-demo-bucket
   ```

   您应看到类似于以下示例的响应。  
![\[list-multipart-uploads命令的结果\]](http://docs.aws.amazon.com/zh_cn/lightsail/latest/userguide/images/amazon-lightsail-s3api-list-multipart-uploads-result.png)

## 使用 Amazon CLI 停止分段上传
<a name="stop-multipart-uploads"></a>

使用 AWS Command Line Interface (AWS CLI) 完成以下步骤以停止分段上传。如果您已开始分段上传但不想继续上传，则可以执行此操作。使用 `abort-multipart-upload` 命令完成此操作。有关更多信息，请参阅《*AWS CLI 命令参考*》[abort-multipart-upload](https://docs.aws.amazon.com/cli/latest/reference/s3api/abort-multipart-upload.html)中的。

**注意**  
在 AWS CLI 继续执行此过程之前，您必须为 Lightsail 和 Amazon S3 安装并对其进行配置。有关更多信息，请参阅[配置为与 Lightsail 配合使用](lightsail-how-to-set-up-and-configure-aws-cli.md)。 AWS CLI 

1. 打开命令提示符或终端窗口。

1. 输入以下命令以将分段上传到存储桶。

   ```
   aws s3api abort-multipart-upload --bucket BucketName --key ObjectKey --upload-id "UploadID" --acl bucket-owner-full-control
   ```

   在该命令中，将以下示例文本替换为自己的文本：
   + *BucketName*-您要停止分段上传的存储桶的名称。
   + *ObjectKey*-分段上传的对象密钥。
   + *UploadID*-您要停止的分段上传的上传 ID。

   示例：

   ```
   aws s3api abort-multipart-upload --bucket amzn-s3-demo-bucket --key sailbot.mp4 --upload-id "R4QU.mO.exampleiHWiLOeNw7JtXX7OotRhTLsXXCzF21CZdYlfj5lfjtiMnpzVw2WPj.exampleBTmL_N_.42.DlHYOTsITFsX.tO3XOUTTAHiCxY5VR8jWRGdkVkUG" --acl bucket-owner-full-control
   ```

   此命令不会返回响应。您可以运行 `list-multipart-uploads` 命令以确认分段上传已停止。