Skip to main content

Multipart Upload

Upload large files in chunks with progress tracking.

Usage

const bucket = client.storage.bucket('videos');

await bucket.upload('presentation.mp4', largeFile, {
contentType: 'video/mp4',
onProgress: (progress) => {
console.log(`Upload: ${progress.percent}%`);
},
});

The SDK automatically:

  1. Splits files larger than 5MB into parts
  2. Uploads parts in parallel
  3. Reports combined progress
  4. Completes the multipart upload on the server

Resume Support

If a multipart upload fails mid-way, the SDK throws a ResumableUploadError containing the uploadId and key needed to resume:

import { ResumableUploadError } from '@edgebase/client';

try {
await bucket.upload('large-video.mp4', file, {
onProgress: (p) => console.log(`${p.percent}%`),
});
} catch (error) {
if (error instanceof ResumableUploadError) {
console.log(`Failed at part ${error.failedPartNumber}, resuming...`);

// Resume — only uploads the remaining parts
const result = await bucket.resumeUpload(
error.key,
error.uploadId,
file, // same file reference
);
console.log('Upload completed:', result.key);
}
}

Query Uploaded Parts

You can check which parts have been uploaded for an in-progress multipart upload:

const { parts } = await bucket.getUploadParts('large-video.mp4', uploadId);
// parts: [{ partNumber: 1, etag: '...' }, { partNumber: 2, etag: '...' }, ...]

Part tracking data is stored in KV with a 7-day TTL (synced with R2's auto-abort window).

Cancel Upload

Multipart uploads can be cancelled mid-flight using .cancel():

const task = bucket.upload('large-video.mp4', file, {
onProgress: (p) => console.log(`${p.percent}%`),
});

// Cancel after 10 seconds
setTimeout(() => task.cancel(), 10_000);

try {
await task;
} catch (err) {
if (err.name === 'AbortError') {
console.log('Upload cancelled');
}
}

Cancelled multipart uploads are automatically cleaned up by R2 after 7 days. resumeUpload() also returns a cancellable UploadTask.

R2 Multipart API

Under the hood, EdgeBase uses R2's Multipart Upload API:

EndpointDescription
POST /api/storage/:bucket/multipart/createInitiate upload
POST /api/storage/:bucket/multipart/upload-part?uploadId=...&partNumber=...&key=...Upload a part
POST /api/storage/:bucket/multipart/completeComplete upload
POST /api/storage/:bucket/multipart/abortAbort upload
GET /api/storage/:bucket/uploads/:uploadId/parts?key=...Fetch uploaded parts for resume

Limits

  • Minimum part size: 5MB (except the last part)
  • Maximum parts: 10,000