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=blocklistwith XML BlockList body (browser-direct)POST /api/upload/azure/completeto 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