S3 multipart upload 最主要用於可以分段上傳同一個檔案到 S3 上,如此便可進行同步上傳,以加快上傳所花費的等候時間,還有一個好處就是可以上傳較大的檔案,因為用一般的 .put_object 的話,檔案過大會發生 Aws::S3::Errors::EntityTooLarge 的 error,而 multipart upload 則上限可以到 5TB,如果切成多個 part 上傳的話,每個 part 不能超過 5GB,最後一個 part 則不在 5GB 限制內。

以下示範:

file = File.open(filepath, 'rb')
s3_client = ::Aws::S3::Client.new
bucket = 'my_bucket'
key = 'path/to/object.gz'
# 初始化
result = s3_client.create_multipart_upload(bucket: bucket, key: key)
upload_id = result.upload_id
# 上傳其中一個 part,這裡只示範一個 part
part_result = s3_client.upload_part(
  body: file, 
  bucket: bucket, 
  key: key, 
  upload_id: upload_id, 
  part_number: 1
)
# 完成上傳
s3_client.complete_multipart_upload(
  bucket: bucket, 
  key: key, 
  multipart_upload: { 
    parts: [
      { 
        etag: part_result.etag, 
        part_number: 1 
      }
    ] 
  }, 
  upload_id: upload_id
)

相關資料參考: