Complete Example -- Chunked Upload Workflow - Content Management
Complete Example -- Chunked Upload Workflow
# --- Step 1: Create an upload token ---
curl -X POST "$KALTURA_SERVICE_URL/service/uploadToken/action/add" \
-d "ks=$KALTURA_KS" \
-d "format=1" \
-d "uploadToken[fileName]=my_video.mp4" \
-d "uploadToken[fileSize]=6291456"
# Save the "id" from the response as UPLOAD_TOKEN_ID
# --- Step 2: Upload file in chunks ---
# Chunk 1 (first 2 MB)
dd if=my_video.mp4 bs=2097152 count=1 skip=0 2>/dev/null | \
curl -X POST "$KALTURA_SERVICE_URL/service/uploadToken/action/upload" \
-F "ks=$KALTURA_KS" \
-F "format=1" \
-F "uploadTokenId=$UPLOAD_TOKEN_ID" \
-F "resume=false" \
-F "resumeAt=0" \
-F "finalChunk=false" \
-F "fileData=@-;filename=chunk_0"
# Chunk 2 (next 2 MB)
dd if=my_video.mp4 bs=2097152 count=1 skip=1 2>/dev/null | \
curl -X POST "$KALTURA_SERVICE_URL/service/uploadToken/action/upload" \
-F "ks=$KALTURA_KS" \
-F "format=1" \
-F "uploadTokenId=$UPLOAD_TOKEN_ID" \
-F "resume=true" \
-F "resumeAt=2097152" \
-F "finalChunk=false" \
-F "fileData=@-;filename=chunk_2097152"
# Chunk 3 / final chunk (last 2 MB)
dd if=my_video.mp4 bs=2097152 count=1 skip=2 2>/dev/null | \
curl -X POST "$KALTURA_SERVICE_URL/service/uploadToken/action/upload" \
-F "ks=$KALTURA_KS" \
-F "format=1" \
-F "uploadTokenId=$UPLOAD_TOKEN_ID" \
-F "resume=true" \
-F "resumeAt=4194304" \
-F "finalChunk=true" \
-F "fileData=@-;filename=chunk_4194304"
# --- Step 3: Create a media entry ---
curl -X POST "$KALTURA_SERVICE_URL/service/media/action/add" \
-d "ks=$KALTURA_KS" \
-d "format=1" \
-d "entry[objectType]=KalturaMediaEntry" \
-d "entry[mediaType]=1" \
-d "entry[name]=my_video.mp4"
# Save the "id" from the response as ENTRY_ID
# --- Step 4: Attach the upload token to the entry ---
curl -X POST "$KALTURA_SERVICE_URL/service/media/action/addContent" \
-d "ks=$KALTURA_KS" \
-d "format=1" \
-d "entryId=$KALTURA_ENTRY_ID" \
-d "resource[objectType]=KalturaUploadedFileTokenResource" \
-d "resource[token]=$UPLOAD_TOKEN_ID"
# --- Step 5: Poll for READY ---
while true; do
STATUS=$(curl -s -X POST "$KALTURA_SERVICE_URL/service/media/action/get" \
-d "ks=$KALTURA_KS" -d "format=1" -d "entryId=$KALTURA_ENTRY_ID" | jq -r '.status')
echo "Status: $STATUS"
[ "$STATUS" = "2" ] && echo "READY" && break
[ "$STATUS" = "-1" ] || [ "$STATUS" = "-2" ] && echo "Failed" && break
sleep 5
done
Resume after failure: Call uploadToken.get to check uploadedFileSize, then resume from that byte offset.