Upload file lớn (>5GB, lên tới TB) lên S3 cần dùng Multipart Upload: chia file thành nhiều part, upload song song/tự do, rồi ghép lại.
Quy trình Multipart Upload S3
- Khởi tạo: Gọi
CreateMultipartUpload→ nhậnUploadId. - Chia file client-side: HTML5 File API
file.slice(start, end)cắt thành các part (mỗi part 5MB - 5GB, tối đa 10,000 part). - Upload từng part: Gọi
UploadPartvớiPartNumber(1-based) vàUploadId. Có thể upload song song nhiều part. - Hoàn tất: Gọi
CompleteMultipartUploadvới danh sách{PartNumber, ETag}của tất cả part. - Hủy: Nếu lỗi, gọi
AbortMultipartUploadđể dọn dẹp part đã upload (tránh chi phí lưu trữ).
Ưu điểm
- Tiếp tục được (resume): Part lỗi chỉ upload lại part đó.
- Song song: Tăng tốc độ upload lớn.
- Tạm dừng/khôi phục: Lưu
UploadIdvà danh sách part đã lên. - Không chi phí transfer EC2↔S3: Nếu dùng EC2 làm trung gian, traffic nội bộ AWS miễn phí.
Kiến trúc đề xuất
Client (Browser) → Presigned URLs → S3 trực tiếp (không qua server trung gian).
- Client request server tạo
CreateMultipartUpload→ lấyUploadId. - Client request server tạo Presigned URL cho từng part (PUT URL).
- Client upload trực tiếp từng part lên S3 qua Presigned URL (song song).
- Client gửi danh sách ETag về server → server gọi
CompleteMultipartUpload.
Cách này giảm tải server, tận dụng băng thông client→S3 trực tiếp, an toàn (Presigned URL hạn chế thời gian/quyền).
Ví dụ chia file client-side (JS)
async function uploadLargeFile(file) {
const chunkSize = 50 * 1024 * 1024; // 50MB
const chunks = [];
for (let start = 0; start < file.size; start += chunkSize) {
const end = Math.min(start + chunkSize, file.size);
chunks.push(file.slice(start, end));
}
// Gọi API lấy presigned URLs cho từng chunk, upload song song với Promise.all...
}