curl -X POST https://app.drime.cloud/api/v1/s3/multipart/batch-sign-part-urls \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"key": "uploads/1e4cbca8.../1e4cbca8...",
"uploadId": "AFNhWKh6Cn6f...",
"partNumbers": [1, 2, 3]
}'
const PART_SIZE = 5 * 1024 * 1024; // 5MB
const totalParts = Math.ceil(file.size / PART_SIZE);
// Get URLs for all parts
const response = await fetch('https://app.drime.cloud/api/v1/s3/multipart/batch-sign-part-urls', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
},
body: JSON.stringify({
key,
uploadId,
partNumbers: Array.from({ length: totalParts }, (_, i) => i + 1)
})
});
const { urls } = await response.json();
// Upload each part
const uploadedParts = [];
for (const { partNumber, url } of urls) {
const start = (partNumber - 1) * PART_SIZE;
const end = Math.min(start + PART_SIZE, file.size);
const chunk = file.slice(start, end);
const uploadResponse = await fetch(url, {
method: 'PUT',
body: chunk
});
const etag = uploadResponse.headers.get('ETag');
uploadedParts.push({ PartNumber: partNumber, ETag: etag });
}
import requests
import math
PART_SIZE = 5 * 1024 * 1024 # 5MB
file_size = 142557981
total_parts = math.ceil(file_size / PART_SIZE)
# Get URLs for all parts
response = requests.post(
'https://app.drime.cloud/api/v1/s3/multipart/batch-sign-part-urls',
headers={'Authorization': 'Bearer YOUR_ACCESS_TOKEN'},
json={
'key': key,
'uploadId': upload_id,
'partNumbers': list(range(1, total_parts + 1))
}
)
urls = response.json()['urls']
{
"urls": [
{
"partNumber": 1,
"url": "https://drimestorage.xxx.r2.cloudflarestorage.com/uploads/...?partNumber=1&..."
},
{
"partNumber": 2,
"url": "https://drimestorage.xxx.r2.cloudflarestorage.com/uploads/...?partNumber=2&..."
},
{
"partNumber": 3,
"url": "https://drimestorage.xxx.r2.cloudflarestorage.com/uploads/...?partNumber=3&..."
}
],
"status": "success"
}
Multipart Uploads
Sign Part URLs
Get presigned URLs for uploading parts
POST
/
s3
/
multipart
/
batch-sign-part-urls
curl -X POST https://app.drime.cloud/api/v1/s3/multipart/batch-sign-part-urls \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"key": "uploads/1e4cbca8.../1e4cbca8...",
"uploadId": "AFNhWKh6Cn6f...",
"partNumbers": [1, 2, 3]
}'
const PART_SIZE = 5 * 1024 * 1024; // 5MB
const totalParts = Math.ceil(file.size / PART_SIZE);
// Get URLs for all parts
const response = await fetch('https://app.drime.cloud/api/v1/s3/multipart/batch-sign-part-urls', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
},
body: JSON.stringify({
key,
uploadId,
partNumbers: Array.from({ length: totalParts }, (_, i) => i + 1)
})
});
const { urls } = await response.json();
// Upload each part
const uploadedParts = [];
for (const { partNumber, url } of urls) {
const start = (partNumber - 1) * PART_SIZE;
const end = Math.min(start + PART_SIZE, file.size);
const chunk = file.slice(start, end);
const uploadResponse = await fetch(url, {
method: 'PUT',
body: chunk
});
const etag = uploadResponse.headers.get('ETag');
uploadedParts.push({ PartNumber: partNumber, ETag: etag });
}
import requests
import math
PART_SIZE = 5 * 1024 * 1024 # 5MB
file_size = 142557981
total_parts = math.ceil(file_size / PART_SIZE)
# Get URLs for all parts
response = requests.post(
'https://app.drime.cloud/api/v1/s3/multipart/batch-sign-part-urls',
headers={'Authorization': 'Bearer YOUR_ACCESS_TOKEN'},
json={
'key': key,
'uploadId': upload_id,
'partNumbers': list(range(1, total_parts + 1))
}
)
urls = response.json()['urls']
{
"urls": [
{
"partNumber": 1,
"url": "https://drimestorage.xxx.r2.cloudflarestorage.com/uploads/...?partNumber=1&..."
},
{
"partNumber": 2,
"url": "https://drimestorage.xxx.r2.cloudflarestorage.com/uploads/...?partNumber=2&..."
},
{
"partNumber": 3,
"url": "https://drimestorage.xxx.r2.cloudflarestorage.com/uploads/...?partNumber=3&..."
}
],
"status": "success"
}
Overview
Gets presigned URLs for uploading one or more parts of a multipart upload. Parts can be uploaded concurrently (recommended limit: 8 concurrent uploads).Request Body
string
required
S3 key from
createMultipartUploadstring
required
Upload ID from
createMultipartUploadarray
required
Array of part numbers to sign (1-indexed)
Response
array
string
Request status (
success)curl -X POST https://app.drime.cloud/api/v1/s3/multipart/batch-sign-part-urls \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"key": "uploads/1e4cbca8.../1e4cbca8...",
"uploadId": "AFNhWKh6Cn6f...",
"partNumbers": [1, 2, 3]
}'
const PART_SIZE = 5 * 1024 * 1024; // 5MB
const totalParts = Math.ceil(file.size / PART_SIZE);
// Get URLs for all parts
const response = await fetch('https://app.drime.cloud/api/v1/s3/multipart/batch-sign-part-urls', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
},
body: JSON.stringify({
key,
uploadId,
partNumbers: Array.from({ length: totalParts }, (_, i) => i + 1)
})
});
const { urls } = await response.json();
// Upload each part
const uploadedParts = [];
for (const { partNumber, url } of urls) {
const start = (partNumber - 1) * PART_SIZE;
const end = Math.min(start + PART_SIZE, file.size);
const chunk = file.slice(start, end);
const uploadResponse = await fetch(url, {
method: 'PUT',
body: chunk
});
const etag = uploadResponse.headers.get('ETag');
uploadedParts.push({ PartNumber: partNumber, ETag: etag });
}
import requests
import math
PART_SIZE = 5 * 1024 * 1024 # 5MB
file_size = 142557981
total_parts = math.ceil(file_size / PART_SIZE)
# Get URLs for all parts
response = requests.post(
'https://app.drime.cloud/api/v1/s3/multipart/batch-sign-part-urls',
headers={'Authorization': 'Bearer YOUR_ACCESS_TOKEN'},
json={
'key': key,
'uploadId': upload_id,
'partNumbers': list(range(1, total_parts + 1))
}
)
urls = response.json()['urls']
{
"urls": [
{
"partNumber": 1,
"url": "https://drimestorage.xxx.r2.cloudflarestorage.com/uploads/...?partNumber=1&..."
},
{
"partNumber": 2,
"url": "https://drimestorage.xxx.r2.cloudflarestorage.com/uploads/...?partNumber=2&..."
},
{
"partNumber": 3,
"url": "https://drimestorage.xxx.r2.cloudflarestorage.com/uploads/...?partNumber=3&..."
}
],
"status": "success"
}
After uploading each part, save the
ETag from the response headers. You’ll need it to complete the upload.⌘I

