Resumable upload middleware for Express and plain Node.js. Server-side component of ngx-uploadx
- resumable simple and chunked uploads
- can save files to the local filesystem, S3, GCS
- saving added metadata along with files
- logging and error handling
- chunks checksum verification
- file type/size/custom validations
- fixed/rolling expiration and cleanup
- extensibility (custom storages, upload protocols, etc)
# Core only (local storage)
npm install @uploadx/core
# Add cloud storage support
npm install @uploadx/s3 # AWS S3, MinIO, etc.
npm install @uploadx/gcs # Google Cloud Storage
# Or get everything in one package
npm install node-uploadxExpress example:
const express = require('express');
const { uploadx } = require('@uploadx/core');
const app = express();
app.use(
'/uploads',
uploadx({
directory: './files',
maxUploadSize: '10GB',
allowMIME: ['video/*'],
onComplete: file => console.log('Upload complete: ', file)
})
);
app.listen(3003);More examples (S3, GCS, plain Node.js, tus, logging, validation) are available in the /examples folder.
The uploadx function accepts either a storage instance or storage options:
import { uploadx, DiskStorage } from '@uploadx/core';
// Option 1: Pass storage instance
const storage = new DiskStorage({ directory: './uploads' });
app.use('/files', uploadx(storage));
// Option 2: Pass options directly (creates storage automatically)
app.use('/files', uploadx({ directory: './uploads', maxUploadSize: '10GB' }));-
directoryDiskStorage upload directory. Default value:"files" -
pathNode http base path. Default value:"/files" -
allowMIMEAllowed MIME types. Default value:["*/*"] -
maxUploadSizeFile size limit. Default value:"5TB" -
metaStorageProvide custom meta storage -
metaStorageConfigConfigure metadata storage -
maxMetadataSizeMetadata size limit. Default value:"4MB" -
validationUpload validation options -
useRelativeLocationUse relative urls. Default value:false -
filenameFile naming function -
userIdentifierGet user identity -
onCreateCallback invoked when a new upload is created -
onUpdateCallback invoked when an upload is updated -
onCompleteCallback invoked when an upload is completed -
onDeleteCallback invoked when an upload is cancelled -
onErrorCustomize error response -
expirationConfiguring the cleanup of abandoned and completed uploads -
logLevelSet built-in logger severity level. Default value:"none"
By default, uploadx uses DiskStorage (local filesystem) — just set the directory option. For cloud or S3‑compatible storage, install the corresponding package and pass a storage instance to the middleware.
| Provider | Package | Description |
|---|---|---|
| Local filesystem | @uploadx/core |
Built-in. Saves files to directory. |
| AWS S3 / compatible | @uploadx/s3 |
Amazon S3, Backblaze B2 S3, MinIO, etc. |
| Google Cloud Storage | @uploadx/gcs |
GCS buckets. |
For configuration, authentication, and usage examples, see the respective package READMEs linked above.
The library uses @logtape/logtape for structured logging. Set logLevel to enable it, or configure LogTape directly for advanced use cases.
See express-logtape.ts for a complete example.
UPLOADX_SECRET - Secret for salting file/user IDs (set to random string in production).
This is a monorepo managed with npm workspaces:
node-uploadx/
├── packages/
│ ├── core/ # @uploadx/core - core functionality
│ ├── s3/ # @uploadx/s3 - S3 storage provider
│ ├── gcs/ # @uploadx/gcs - Google Cloud Storage provider
│ └── node-uploadx/ # All-in-one package
├── examples/ # Usage examples
│ ├── express.ts
│ ├── express-s3.ts
│ ├── express-gcs.ts
│ └── ...
├── test/ # Test suite
├── README.md
└── ...
If you'd like to contribute, please fork the repository and make changes as you'd like. Pull requests are welcome!
- API Protocol - HTTP methods, headers, resumable flow
- Examples - working examples
- ngx-uploadx - client-side library
MIT License — see LICENSE for details.