Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> JavaScript

Chia nhỏ và upload file cực lớn lên Amazon S3 (Multipart Upload)

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

  1. Khởi tạo: Gọi CreateMultipartUpload → nhận UploadId.
  2. 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).
  3. Upload từng part: Gọi UploadPart với PartNumber (1-based) và UploadId. Có thể upload song song nhiều part.
  4. Hoàn tất: Gọi CompleteMultipartUpload với danh sách {PartNumber, ETag} của tất cả part.
  5. 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 UploadId và 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).

  1. Client request server tạo CreateMultipartUpload → lấy UploadId.
  2. Client request server tạo Presigned URL cho từng part (PUT URL).
  3. Client upload trực tiếp từng part lên S3 qua Presigned URL (song song).
  4. 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...
}