Ongoing service disruptions
For the most recent update on ongoing service disruptions affecting the AWS Middle East (UAE) Region (ME-CENTRAL-1), refer to the AWS Health Dashboard. For information on AWS Service migration, see How do I migrate my services to another region?
如何使用 AWS CLI 將大型檔案分成多個部分上傳到 Amazon S3?
我想要將一個大檔案分成多個部分複製到 Amazon Simple Storage Service (Amazon S3) 儲存貯體,或使用分段上傳。我想使用 AWS Command Line Interface (AWS CLI) 上傳檔案。
簡短說明
使用具有高階 aws s3 命令或低階 aws s3api 命令的 AWS CLI,將大型檔案上傳至 Amazon S3。有關更多這兩個命令層的資訊,請參閱將 Amazon S3 與 AWS CLI 搭配使用。
**重要:**最佳實務是使用 aws s3 命令 (例如 aws s3 cp) 進行分段上傳和下載。這是因為 aws s3 命令會根據檔案大小自動執行分段上傳和下載。只有當 aws s3 命令不支援特定上傳作業時,才使用 aws s3api 命令 (例如 aws s3api create-multipart-upload)。例如,分段上傳涉及多個伺服器,或者您手動停止分段上傳並在之後繼續時。或者,aws s3 命令不支援必要的請求參數。
解決方法
**注意:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤,請參閱AWS CLI 錯誤疑難排解。此外,請確認您使用的是最新的 AWS CLI 版本。
上傳檔案前,請計算檔案的 MD5 總和檢查碼值,作為上傳後完整性檢查的參考依據。
使用 aws s3 命令
若要使用高階 aws s3 命令進行分段上傳,請執行以下 cp 命令:
aws s3 cp large_test_file s3://DOC-EXAMPLE-BUCKET/
注意: 請將 DOC-EXAMPLE-BUCKET 替換為您的儲存貯體名稱。
上述範例使用 aws s3 cp 命令,當物件較大時會自動執行分段上傳。您也可以使用其他 aws s3 命令,將物件上傳至 S3 儲存貯體。例如,使用 aws s3 sync 或 aws s3 mv。
以多個部分上傳至 Amazon S3 的物件,其 ETag 格式與使用 PUT 請求上傳的物件不同。若要將來源檔案的 MD5 總和檢查碼值作為參考儲存,請在上傳檔案時,將該總和檢查碼值作為自訂中繼資料一併上傳。若要將 MD5 檢查碼 值新增為自訂中繼資料,請在上傳命令中加入選用參數 --metadata,如以下範例所示:
aws s3 cp large_test_file s3://DOC-EXAMPLE-BUCKET/ --metadata md5="examplemd5value1234"
注意: 請將 large_test_file 替換為要上傳的檔案名稱,將 DOC-EXAMPLE-BUCKET 替換為您的儲存貯體名稱,並將 examplemd5value1234 替換為您的 MD5 值。
若要使用更多主機的頻寬與資源,請提高在 AWS CLI S3 組態中設定的最大並行請求數。依預設,AWS CLI 使用最多 10 個並行請求。請執行以下 configure 命令,將最大並行請求數設定為 20:
aws configure set default.s3.max_concurrent_requests 20
使用 aws s3api 命令
-
將您要上傳的檔案分割為多個部分。
**提示:**如果您使用的是 Linux 作業系統,請使用 split 命令。 -
若要啟動分段上傳並擷取相關的上傳 ID,請執行以下 create-multipart-upload 命令:
aws s3api create-multipart-upload --bucket DOC-EXAMPLE-BUCKET --key large_test_file注意: 請將 DOC-EXAMPLE-BUCKET 替換為您的儲存貯體名稱,並將 large_test_file 替換為要上傳的檔案名稱。
此命令會傳回包含 UploadID 的回應。
-
請複製 UploadID 值,作為後續步驟的參考。
-
若要上傳檔案的第一個部分,請執行以下 upload-part 命令:
aws s3api upload-part --bucket DOC-EXAMPLE-BUCKET --key large_test_file --part-number 1 --body large_test_file.001 --upload-id exampleTUVGeKAk3Ob7qMynRKqe3ROcavPRwg92eA6JPD4ybIGRxJx9R0VbgkrnOVphZFK59KCYJAO1PXlrBSW7vcH7ANHZwTTf0ovqe6XPYHwsSp7eTRnXB1qjx40Tk --content-md5 exampleaAmjr+4sRXUwf0w==注意: 請將 DOC-EXAMPLE-BUCKET 替換為您的儲存貯體名稱,並將 large_test_file 替換為要上傳的檔案名稱。請將 upload-id 值替換為 create-multipart-upload 命令輸出中的值。
該命令會傳回一個回應,其中包含您上傳的檔案部分 ETag 值。
-
請將 ETag 的值複製下來,作為後續步驟的參考依據。
-
請對檔案的每個部分重複執行步驟 4 和 5。請確保每次上傳新的部分時,部份編號都有依序遞增。
-
在上傳所有檔案部分之後,請執行以下 list-parts 命令以列出已上傳的部分,並確認清單完整:
aws s3api list-parts --bucket DOC-EXAMPLE-BUCKET --key large_test_file --upload-id exampleTUVGeKAk3Ob7qMynRKqe3ROcavPRwg92eA6JPD4ybIGRxJx9R0VbgkrnOVphZFK59KCYJAO1PXlrBSW7vcH7ANHZwTTf0ovqe6XPYHwsSp7eTRnXB1qjx40Tk注意: 請將 DOC-EXAMPLE-BUCKET 替換為您的儲存貯體名稱,並將 large_test_file 替換為要上傳的檔案名稱。請將 upload-id 值替換為 create-multipart-upload 命令輸出中的值。
-
將您上傳的每個檔案部分的 ETag 值彙整成一個 JSON 格式的檔案。
JSON 檔案範例:{ "Parts": [{ "ETag": "example8be9a0268ebfb8b115d4c1fd3", "PartNumber":1 }, .... { "ETag": "example246e31ab807da6f62802c1ae8", "PartNumber":4 }] } -
請將檔案命名為 fileparts.json。
-
若要完成分段上傳,請執行以下 complete-multipart-upload 命令:
aws s3api complete-multipart-upload --multipart-upload file://fileparts.json --bucket DOC-EXAMPLE-BUCKET --key large_test_file --upload-id exampleTUVGeKAk3Ob7qMynRKqe3ROcavPRwg92eA6JPD4ybIGRxJx9R0VbgkrnOVphZFK59KCYJAO1PXlrBSW7vcH7ANHZwTTf0ovqe6XPYHwsSp7eTRnXB1qjx40Tk
注意: 請將 --multipart-upload 的值替換為包含您所建立之 ETags 的 JSON 格式檔案路徑。請將 DOC-EXAMPLE-BUCKET 替換為您的儲存貯體名稱,並將 large_test_file 替換為要上傳的檔案名稱。請將 upload-id 值替換為 list-multipart-uploads 命令輸出中的值。
- 如果上述命令成功執行,那麼您會收到類似以下內容的回應:
{ "ETag": "\\"exampleae01633ff0af167d925cad279-2\\"", "Bucket": "DOC-EXAMPLE-BUCKET", "Location": "https://DOC-EXAMPLE-BUCKET.s3.amazonaws.com/large_test_file", "Key": "large_test_file" }
解決上傳失敗問題
如果您使用高階 aws s3 命令進行分段上傳時上傳失敗,則必須啟動新的分段上傳。分段上傳失敗通常是因為逾時或手動取消所導致。大多數情況下,AWS CLI 會自動取消分段上傳,然後移除您建立的所有分段檔案。此程序可能需要幾分鐘。如果您使用 aws s3api 命令且該程序中斷,請移除未完成的上傳部分,然後重新上傳這些部分。
若要移除未完成的部分,請使用 AbortIncompleteMultipartUpload 生命週期動作。或者,使用 aws s3api 命令移除不完整的部分。
-
若要列出未完成的分段檔案上傳,請執行以下 list-multipart-uploads 命令:
aws s3api list-multipart-uploads --bucket DOC-EXAMPLE-BUCKET注意: 請將 DOC-EXAMPLE-BUCKET 替換為您的儲存貯體名稱。
-
此命令會傳回包含任何未處理檔案部分的訊息,如以下範例所示:
{ "Uploads": [ { "Initiator": { "DisplayName": "multipartmessage", "ID": "290xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx " }, "Initiated": "2016-03-31T06:13:15.000Z", "UploadId": "examplevQpHp7eHc_J5s9U.kzM3GAHeOJh1P8wVTmRqEVojwiwu3wPX6fWYzADNtOHklJI6W6Q9NJUYgjePKCVpbl_rDP6mGIr2AQJNKB_A-", "StorageClass": "STANDARD", "Key": "", "Owner": { "DisplayName": "multipartmessage", "ID": "290xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx " } } ] } -
若要移除未完成的部分,請執行以下 abort-multipart-upload 命令:
aws s3api abort-multipart-upload --bucket DOC-EXAMPLE-BUCKET --key large_test_file --upload-id examplevQpHp7eHc_J5s9U.kzM3GAHeOJh1P8wVTmRqEVojwiwu3wPX6fWYzADNtOHklJI6W6Q9NJUYgjePKCVpbl_rDP6mGIr2AQJNKB注意: 請將 DOC-EXAMPLE-BUCKET 替換為您的儲存貯體名稱,並將 large_test_file 替換為要上傳的檔案名稱。請將 upload-id 值替換為 list-multipart-uploads 命令輸出中的值。
相關資訊
相關內容
- 已提問 9 個月前

