Với file lớn trên mạng không ổn định, một PUT đơn dễ đứt giữa chừng và phải làm lại từ đầu. Dùng multipart / chunked upload.
Luồng (S3 multipart):
1. Client chia file thành các part (vd 5–10 MB/part) và gọi initiate → nhận uploadId.
2. Từng part upload độc lập (mỗi part có presigned URL riêng); server/S3 trả ETag cho mỗi part. Có thể upload song song vài part một lúc để nhanh.
3. Xong hết thì gọi complete với danh sách part number + ETag → S3 ghép thành một object.
const { UploadId } = await s3.createMultipartUpload({ Bucket, Key })
const parts = []
for (let i = 0; i < chunks.length; i++) {
const { ETag } = await s3.uploadPart({ Bucket, Key, UploadId, PartNumber: i + 1, Body: chunks[i] })
parts.push({ PartNumber: i + 1, ETag })
}
await s3.completeMultipartUpload({ Bucket, Key, UploadId, MultipartUpload: { Parts: parts } })Resume: nếu đứt, hỏi lại những part đã nhận (ListParts) rồi chỉ upload phần còn thiếu, không làm lại từ đầu.
Progress bar: cộng byte đã upload của các part / tổng size; từng part theo dõi qua sự kiện tiến trình (vd XMLHttpRequest.upload.onprogress / fetch stream). Upload song song thì gộp tiến trình các part.
Lưu ý: đặt TTL và abort cho multipart bỏ dở (các part lơ lửng vẫn tính phí lưu trữ); xác thực từng part; kiểm tra checksum sau khi ghép. Bẫy: quên dọn multipart dở dang → tốn tiền âm thầm.