CoreUpload is a drop-in Tag Helper + Razor component with 7 transport strategies (chunked, direct-to-S3, Azure Blob, GCS resumable, tus 1.0, URL import, single POST), 4 cloud-source pickers (Drive, Dropbox, OneDrive, Box), AES-GCM encryption-at-rest, offline-mode queueing, inline image annotation + 5 image presets + HEIC auto-convert, pre-upload virus-scan hook, cross-tab coordination, drag-to-reorder queue, and 30 built-in locales (incl. RTL Arabic + Hebrew) - all wired into ASP.NET Core middleware with zero external dependencies on AWS, Azure, or Google SDKs in the core library.
Trusted by teams at
Transport
Switch from chunked POST to direct-to-S3 multipart, GCS resumable, or tus 1.0 without rewriting your upload flow. Register your own transport via CoreUpload.registerStrategy().
single
Traditional multipart/form-data POST. Ideal for small files and simple forms.
chunked
Splits file into parts, uploads with parallel concurrency, per-chunk retry with exponential backoff, and server-side assembly.
s3
Browser uploads each part directly to Amazon S3 (or MinIO, Backblaze B2, Cloudflare R2, Wasabi) via your server-signed presigned URLs. Server never sees the bytes.
azure
PutBlock + PutBlockList against a pre-signed blob SAS URL. Same pattern as S3 - client does the work, server just signs.
tus
Zero-dependency tus 1.0 client with Core + Creation + Termination extensions. Interop with tusd, uppy-companion, and any tus server.
gcs NEW 5.1
Google Cloud Storage resumable upload protocol. Server initiates the session via IGcsSigner; browser PUTs chunks with Content-Range headers. 256 KiB grain auto-aligned. Bytes never traverse Kestrel.
urlImport
Paste a URL; the server fetches and streams through your IUploaderProvider. Client sees live NDJSON progress events during the fetch.
What's new in 5.1
15 new capabilitiesCloud-source pickers, encryption-at-rest, offline queueing, inline annotation, virus-scan integration, cross-tab coordination, GCS resumable, 10 new locales, and more. All additive - no breaking changes from 5.0.
Built-in OAuth pickers, lazy-loaded. Each adapter resolves with RemoteFile[] handed to the URL-import pipeline with NDJSON live progress.
PBKDF2 (200k iter), per-file salt + IV. Kestrel only ever sees ciphertext. Decryption recipe in .NET 8 with AesGcm ships in the docs.
One virusScan hook integrates ClamAV / VirusTotal / Defender. Rejected files never reach storage.
Files queue to IndexedDB while offline; uploads auto-resume when the connection returns. Register a Service Worker for background sync.
iPhone HEIC auto-converts to JPEG. 5 presets bundle resize + crop + auto-orient. Inline 6-tool markup (pen/arrow/rect/text/blur/eraser) before upload.
Extractable progress chrome you can mount anywhere on your page. Cross-tab coordination + a "manager tab" can aggregate every tab's uploads.
enableQueueReorder lets users drag pending tasks - Arrow Up/Down for keyboard accessibility (WCAG 2.1). Mobile cameraCapture for direct camera launch.
+ SV, NO, DA, FI, HU, RO, BG, EL, BN, UK in 5.1. Arabic and Hebrew with right-to-left. Pairs with RequestLocalizationOptions for auto-detection.
Pluggable retryPolicy for Retry-After / jitter / budgets. maxUploadBytesPerSecond for fair bandwidth use.
Capabilities
Not a file-input replacement - an upload toolkit that handles the hard parts so you can focus on your application.
Every in-flight upload persists to IndexedDB. Tab crashes, page reloads, network blips - the resumed task picks up its server session (tus URL, S3 part ETags, chunk offsets) and continues from where it stopped.
Configurable chunk concurrency keeps the pipe full. SHA-256 and CRC32 hashing runs off-thread - gigabyte files no longer block the UI, with a CSP-safe main-thread fallback.
Rotate +/-90 deg, flip H/V, interactive crop with 8 drag handles and optional aspect-ratio lock. Layered on the existing client-side resize, compress, and watermark pipeline.
Drag-and-drop, full-page drop overlay, folder traversal, clipboard paste, and server URL import with live NDJSON progress - all through a single API.
Extensions, MIME types with magic-byte sniffing, file sizes, image dimensions, duplicate detection, and custom rules - enforced client-side and re-checked server-side.
Default, Bootstrap, Tailwind, and dark-mode themes. CSS variables expose every color + radius + spacing. Every user-facing string localized; register your own locale in one literal.
ASP.NET Core native
DI, minimal APIs, Tag Helpers, and IFormFile-compatible streaming. Targets .NET 8 and newer.
services.AddCoreUpload(), app.MapCoreUploadEndpoints(), and <core-upload> Tag Helper. Everything composes with your existing pipeline.
IUploaderProvider, IS3Signer, IAzureSigner, IGcsSigner - no AWS, Azure, or Google SDK bundled. Your host plugs in the signer, the library stays dependency-light.
Run directly on Kestrel or behind IIS reverse proxy. Linux and Windows containers fully supported - no platform-specific workarounds.
Quick start
Register the services, map the endpoints, drop the Tag Helper. Advanced configuration (strategies, resume, image editor) is on the JS instance that the Tag Helper renders.
Program.cs & Page.cshtml
// Program.cs
builder.Services.AddCoreUpload();
// For direct-to-S3 / Azure (no AWS/Azure SDK bundled - provide your own signer)
builder.Services.AddSingleton<IS3Signer, MyS3Signer>();
builder.Services.AddSingleton<IAzureSigner, MyAzureSigner>();
var app = builder.Build();
app.MapCoreUploadEndpoints();
<!-- Page.cshtml -->
<core-upload asp-upload-url="/api/upload/upload"
asp-extensions=".jpg,.png,.gif,.pdf,.docx"
asp-max-size="500MB"
asp-multiple="true"
asp-auto-upload="true" /> Advanced: direct-to-S3 + IndexedDB resume
// Select the strategy + persistence on the rendered instance
CoreUpload.create('#uploader', {
uploadUrl: '/api/upload/upload',
strategy: 's3', // or 'chunked', 'azure', 'tus', 'urlImport' chunkSize: 5 * 1024 * 1024,
chunkConcurrency: 4,
persistState: true,
persistAdapter: 'indexeddb',
persistBlobs: true // survive tab crashes without re-picking files
}); Install via NuGet: dotnet add package CoreUpload
Uploader family
All three products ship from one canonical JavaScript source with a shared wire protocol. Pick the server flavor for your application.
This site
Minimal-API endpoints, Tag Helper, and Razor components for .NET 8 and newer.
ASP.NET Web Forms
Server control with Visual Studio integration and a CuteWebUI 4.x compatibility shim.
Standalone JS
Zero-dependency npm package for any backend - React, Vue, Node, PHP, Python, static sites.
Download the package, drop the Tag Helper into a Razor page, and see uploads working in under five minutes.