CoreUpload is a drop-in Tag Helper + Razor component with the new self-hosted Companion broker that keeps cloud tokens server-side, 6 cloud sources (Drive, Dropbox, OneDrive, Box, Unsplash, Companion), headless hooks for React, Vue, Svelte, and Angular, a content-aware image editor with smart-crop, overlays, filters, and AVIF/WebP output, 7 transport strategies (chunked, direct-to-S3, Azure Blob, GCS resumable, tus 1.0, URL import, single POST), AES-GCM encryption-at-rest, offline-mode queueing, and 28 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
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.
Try it now
The uploader on the right is the real component, running on this page - drop a file and watch it go. No sign-up, no API key, no card. On localhost you don't even need a license.
dotnet add package CoreUploadProgram.csbuilder.Services.AddCoreUpload(); app.MapCoreUploadEndpoints();
<core-upload asp-upload-url="/api/upload/upload" />That's the whole integration. Progress, validation, chunking, and resume are on by default.
Files land in the demo's temp folder and auto-expire. 50 MB cap on this page.
What's new in 5.2
Headline releaseThe Companion broker, two new cloud sources, headless hooks for all four major frameworks, and a content-aware image editor with AVIF/WebP output. All additive - no breaking changes from 5.1.
A self-hosted Node/Express OAuth and file-proxy broker (multipleupload/server/companion) with zero new dependencies. Provider client secrets and access tokens stay server-side. Built-in Dropbox, Box, Drive, OneDrive; proxy and server-to-destination transfer modes; HMAC-signed OAuth state.
useUploader() for React and Vue, a use:uploader action for Svelte, and an UploaderService for Angular return files, progress, status, and actions for fully custom UI.
Content-aware focal-point smart-crop (edge-energy, no ML), draggable text and sticker overlays, filter presets (Mono/Sepia/Warm/Cool/Vivid), EXIF info panel, crop-ratio chips, and AVIF/WebP output with a quality slider. URL transforms honored server-side via a pluggable IImageTransformer.
Drive, Dropbox, OneDrive, Box (now first-class), Unsplash (search and import, no OAuth popup), and the Companion broker. 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.
Locale auto-detect from navigator.language across ~28 locales. Arabic and Hebrew with right-to-left. Pairs with RequestLocalizationOptions for server-side negotiation.
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.
Why self-hosted
Upload SaaS bills you for every file and gigabyte, forever, and keeps your data on their cloud. CoreUpload is a one-time license that runs inside your own app - the bytes never leave your infrastructure.
| CoreUploadSelf-hosted component | SaaS upload APIse.g. Uploadcare, Filestack | Roll your ownIFormFile + custom JS | |
|---|---|---|---|
| Where your files live | Your own server or storage | The vendor's cloud | Your server |
| Pricing model | One-time perpetual license | Per-upload + per-GB, monthly | Engineering time |
| Ongoing usage fees | None | Scale with every upload | Infrastructure only |
| Data residency & compliance | You control it entirely | Vendor's regions & policies | You control it entirely |
| Vendor lock-in | None - it runs in your app | High | None |
| .NET-native (Tag Helper, DI, middleware) | REST API / SDK | Build it yourself | |
| Chunked, resumable, S3, Azure, tus | Built-in | Varies by plan | Build each |
| Works air-gapped / offline | Depends | ||
| Time to first upload | Minutes | Hours | Weeks |
Comparison reflects the typical model for each category; SaaS pricing and capabilities vary by vendor and plan.
Download the package, drop the Tag Helper into a Razor page, and see uploads working in under five minutes.