Skip to main content

Multipart Upload

Beta

This feature is in beta. Core behavior is stable, but some APIs or configuration may change before general availability.

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