What is express-fileupload?
The express-fileupload npm package is a middleware for handling file uploads in Express applications. It simplifies the process of uploading files to a server by providing an easy-to-use interface and various configuration options.
What are express-fileupload's main functionalities?
Basic File Upload
This feature allows for basic file uploads. The code sets up an Express server with the express-fileupload middleware, and defines a POST route to handle file uploads. Uploaded files are moved to a specified directory on the server.
const express = require('express');
const fileUpload = require('express-fileupload');
const app = express();
app.use(fileUpload());
app.post('/upload', (req, res) => {
if (!req.files || Object.keys(req.files).length === 0) {
return res.status(400).send('No files were uploaded.');
}
let sampleFile = req.files.sampleFile;
sampleFile.mv('/somewhere/on/your/server/filename.jpg', function(err) {
if (err)
return res.status(500).send(err);
res.send('File uploaded!');
});
});
app.listen(3000, () => {
console.log('Server started on http://localhost:3000');
});
File Size Limit
This feature allows setting a file size limit for uploads. The code configures the express-fileupload middleware to limit the file size to 50MB.
const express = require('express');
const fileUpload = require('express-fileupload');
const app = express();
app.use(fileUpload({
limits: { fileSize: 50 * 1024 * 1024 }, // 50MB
}));
app.post('/upload', (req, res) => {
if (!req.files || Object.keys(req.files).length === 0) {
return res.status(400).send('No files were uploaded.');
}
let sampleFile = req.files.sampleFile;
sampleFile.mv('/somewhere/on/your/server/filename.jpg', function(err) {
if (err)
return res.status(500).send(err);
res.send('File uploaded!');
});
});
app.listen(3000, () => {
console.log('Server started on http://localhost:3000');
});
Using Temp Files
This feature allows the use of temporary files during the upload process. The code configures the express-fileupload middleware to use temporary files and specifies a directory for these temp files.
const express = require('express');
const fileUpload = require('express-fileupload');
const app = express();
app.use(fileUpload({
useTempFiles: true,
tempFileDir: '/tmp/'
}));
app.post('/upload', (req, res) => {
if (!req.files || Object.keys(req.files).length === 0) {
return res.status(400).send('No files were uploaded.');
}
let sampleFile = req.files.sampleFile;
sampleFile.mv('/somewhere/on/your/server/filename.jpg', function(err) {
if (err)
return res.status(500).send(err);
res.send('File uploaded!');
});
});
app.listen(3000, () => {
console.log('Server started on http://localhost:3000');
});
Other packages similar to express-fileupload
multer
Multer is a Node.js middleware for handling multipart/form-data, which is primarily used for uploading files. It is highly configurable and allows for fine-grained control over file storage and handling. Compared to express-fileupload, Multer offers more flexibility and control over file handling, but it may require more setup and configuration.
formidable
Formidable is a Node.js module for parsing form data, especially file uploads. It is a low-level library that provides a lot of control over file uploads and form parsing. Compared to express-fileupload, Formidable is more complex and offers more detailed control over the file upload process, but it may be more difficult to use for simple use cases.
busboy
Busboy is a Node.js module for parsing incoming HTML form data. It is a low-level library that provides a stream-based interface for handling file uploads. Compared to express-fileupload, Busboy offers more control and efficiency for handling large file uploads, but it requires more setup and understanding of streams in Node.js.
express-fileupload
Simple express middleware for uploading files.
Version 1.1.1 Breaking Changes
Breaking change to md5
handling:
md5
value contains md5 hash instead of a function to compute it.md5
now can be used with useTempFiles: true
.
Version 1.0.0 Breaking Changes
Breaking change to md5
handling. Read about it here.
Install
npm install --save express-fileupload
yarn add express-fileupload
Usage
When you upload a file, the file will be accessible from req.files
.
Example:
- You're uploading a file called car.jpg
- Your input's name field is foo:
<input name="foo" type="file" />
- In your express server request, you can access your uploaded file from
req.files.foo
:
app.post('/upload', function(req, res) {
console.log(req.files.foo);
});
The req.files.foo object will contain the following:
req.files.foo.name
: "car.jpg"req.files.foo.mv
: A function to move the file elsewhere on your serverreq.files.foo.mimetype
: The mimetype of your filereq.files.foo.data
: A buffer representation of your file, returns empty buffer in case useTempFiles option was set to true.req.files.foo.tempFilePath
: A path to the temporary file in case useTempFiles option was set to true.req.files.foo.truncated
: A boolean that represents if the file is over the size limitreq.files.foo.size
: Uploaded size in bytesreq.files.foo.md5
: MD5 checksum of the uploaded file
Examples
Using Busboy Options
Pass in Busboy options directly to the express-fileupload middleware. Check out the Busboy documentation here.
app.use(fileUpload({
limits: { fileSize: 50 * 1024 * 1024 },
}));
Using useTempFile Options
Use temp files instead of memory for managing the upload process.
app.use(fileUpload({
useTempFiles : true,
tempFileDir : '/tmp/'
}));
Available Options
Pass in non-Busboy options directly to the middleware. These are express-fileupload specific options.
Option | Acceptable Values | Details |
---|
createParentPath | | Automatically creates the directory path specified in .mv(filePathName) |
uriDecodeFileNames | | Applies uri decoding to file names if set true. |
safeFileNames | | Strips characters from the upload's filename. You can use custom regex to determine what to strip. If set to true , non-alphanumeric characters except dashes and underscores will be stripped. This option is off by default.
Example #1 (strip slashes from file names): app.use(fileUpload({ safeFileNames: /\\/g })) Example #2: app.use(fileUpload({ safeFileNames: true })) |
preserveExtension | false (default)true Number
| Preserves filename extension when using safeFileNames option. If set to true , will default to an extension length of 3. If set to Number , this will be the max allowable extension length. If an extension is smaller than the extension length, it remains untouched. If the extension is longer, it is shifted.
Example #1 (true):
app.use(fileUpload({ safeFileNames: true, preserveExtension: true })); myFileName.ext --> myFileName.ext
Example #2 (max extension length 2, extension shifted):
app.use(fileUpload({ safeFileNames: true, preserveExtension: 2 })); myFileName.ext --> myFileNamee.xt |
abortOnLimit | | Returns a HTTP 413 when the file is bigger than the size limit if true. Otherwise, it will add a truncate = true to the resulting file structure. |
responseOnLimit | 'File size limit has been reached' (default)String
| Response which will be send to client if file size limit exceeded when abortOnLimit set to true. |
limitHandler | false (default)function(req, res, next)
| User defined limit handler which will be invoked if the file is bigger than configured limits. |
useTempFiles | | Will use temporary files at the specified tempDir for managing uploads rather than using buffers in memory. This avoids memory issues when uploading large files. |
tempFileDir | | Used with the useTempFiles option. Path to the directory where temp files will be stored during the upload process. Feel free to add trailing slash, but it is not necessary. |
parseNested | | By default, req.body and req.files are flattened like this: {'name': 'John', 'hobbies[0]': 'Cinema', 'hobbies[1]': 'Bike'}
When this option is enabled they are parsed in order to be nested like this: {'name': 'John', 'hobbies': ['Cinema', 'Bike']} |
Help Wanted
Looking for additional maintainers. Please contact richardgirges [ at ] gmail.com
if you're interested. Pull Requests are welcomed!
Thanks & Credit
Brian White for his stellar work on the Busboy Package and the connect-busboy Package