Direct-to-S3 / Azure tus 1.0 resume IndexedDB Golden Retriever 30 locales Webcam & screen capture

Direct-to-Azure Blob upload

The browser uploads each block via PutBlock against a pre-signed blob SAS URL, then finalises with a single PutBlockList. Mirror of the S3 pattern - your server signs once per upload and the bytes bypass it entirely. IndexedDB resume preserves the uploadId + already-committed block IDs so reloads pick up where they stopped.

What you should see: the browser PUTs 4 MB blocks straight to Azure Blob Storage using short-lived signatures from your server — the bytes never pass through your application. Resumable via IndexedDB.
Setup required. This demo needs a working Azure Storage account + container. Edit appsettings.json:
"DemoAzure": {
 "ConnectionString": "DefaultEndpointsProtocol=https;AccountName=...;AccountKey=...;EndpointSuffix=core.windows.net",
 "ContainerName": "your-container"
}
Then restart the site. The existing DemoAzureSigner implementation will auto-register with DI.

Client config

CoreUpload.create('#uploader', {
 uploadUrl: '/api/upload/upload',
 strategy: 'azure',
 chunkSize: 4 * 1024 * 1024, // Azure block size chunkConcurrency: 4,
 persistState: true,
 persistAdapter: 'indexeddb'
});

Server side (Program.cs)

builder.Services.AddSingleton<IAzureSigner, DemoAzureSigner>();

Wire protocol

  • POST /api/upload/azure/create -> { uploadId, blobUrl, blockIdPrefix }
  • PUT {blobUrl}&comp=block&blockid=... per block (browser-direct)
  • PUT {blobUrl}&comp=blocklist with XML BlockList body (browser-direct)
  • POST /api/upload/azure/complete to record metadata server-side

Container CORS

az storage cors add \
 --methods PUT \
 --origins https://coreupload.com \
 --allowed-headers "*" \
 --exposed-headers "*" \
 --services b \
 --max-age 3600