UNPKG

8.49 kBMarkdownView Raw
1# express-fileupload
2Simple express middleware for uploading files.
3
4[![npm](https://img.shields.io/npm/v/express-fileupload.svg)](https://www.npmjs.org/package/express-fileupload)
5[![Build Status](https://travis-ci.org/richardgirges/express-fileupload.svg?branch=master)](https://travis-ci.org/richardgirges/express-fileupload)
6[![downloads per month](http://img.shields.io/npm/dm/express-fileupload.svg)](https://www.npmjs.org/package/express-fileupload)
7[![Coverage Status](https://img.shields.io/coveralls/richardgirges/express-fileupload.svg)](https://coveralls.io/r/richardgirges/express-fileupload)
8
9# Install
10```bash
11# With NPM
12npm install --save express-fileupload
13
14# With Yarn
15yarn add express-fileupload
16```
17
18# Usage
19When you upload a file, the file will be accessible from `req.files`.
20
21Example:
22* You're uploading a file called **car.jpg**
23* Your input's name field is **foo**: `<input name="foo" type="file" />`
24* In your express server request, you can access your uploaded file from `req.files.foo`:
25```javascript
26app.post('/upload', function(req, res) {
27 console.log(req.files.foo); // the uploaded file object
28});
29```
30
31The **req.files.foo** object will contain the following:
32* `req.files.foo.name`: "car.jpg"
33* `req.files.foo.mv`: A function to move the file elsewhere on your server
34* `req.files.foo.mimetype`: The mimetype of your file
35* `req.files.foo.data`: A buffer representation of your file, returns empty buffer in case useTempFiles option was set to true.
36* `req.files.foo.tempFilePath`: A path to the temporary file in case useTempFiles option was set to true.
37* `req.files.foo.truncated`: A boolean that represents if the file is over the size limit
38* `req.files.foo.size`: Uploaded size in bytes
39* `req.files.foo.md5`: MD5 checksum of the uploaded file
40
41**Notes about braking changes with md5 handling:**
42
43* Before 1.0.0 `md5` is a MD5 checksum of the uploaded file.
44* In 1.0.0 and till 1.1.1 `md5` value is a function to compute md5 hash [Read about it here.](https://github.com/richardgirges/express-fileupload/releases/tag/v1.0.0-alpha.1)
45* From 1.1.1 it was reverted back to MD5 checksum value and also added full md5 support in case of using temporary files.
46
47
48### Examples
49* [Example Project](https://github.com/richardgirges/express-fileupload/tree/master/example)
50* [Basic File Upload](https://github.com/richardgirges/express-fileupload/tree/master/example#basic-file-upload)
51* [Multi-File Upload](https://github.com/richardgirges/express-fileupload/tree/master/example#multi-file-upload)
52
53### Using Busboy Options
54Pass in Busboy options directly to the express-fileupload middleware. [Check out the Busboy documentation here.](https://github.com/mscdex/busboy#api)
55
56```javascript
57app.use(fileUpload({
58 limits: { fileSize: 50 * 1024 * 1024 },
59}));
60```
61
62### Using useTempFile Options
63Use temp files instead of memory for managing the upload process.
64
65```
66 Note that this option available for versions 1.0.0 and newer.
67```
68
69```javascript
70app.use(fileUpload({
71 useTempFiles : true,
72 tempFileDir : '/tmp/'
73}));
74```
75### Using debug option
76
77You can set `debug` option to `true` to see some logging about upload process.
78In this case middleware uses `console.log` and adds `Express-file-upload` prefix for outputs.
79
80It will show you whether the request is illigable and also common events triggered during upload.
81That can be really usfull for troubleshhoting and ***we recommend to attach debug output to each issue on Github***.
82
83***Output example:***
84
85```
86Express-file-upload: Temporary file path is /node/express-fileupload/test/temp/tmp-16-1570084843942
87Express-file-upload: New upload started testFile->car.png, bytes:0
88Express-file-upload: Uploading testFile->car.png, bytes:21232...
89Express-file-upload: Uploading testFile->car.png, bytes:86768...
90Express-file-upload: Upload timeout testFile->car.png, bytes:86768
91Express-file-upload: Cleaning up temporary file /node/express-fileupload/test/temp/tmp-16-1570084843942...
92```
93
94***Description:***
95
96* `Temporary file path is...` says that `useTempfiles` was set to true and also shows you temp file name and path.
97* `New upload started testFile->car.png` says that new upload started with field `testFile` and file name `car.png`.
98* `Uploading testFile->car.png, bytes:21232...` shows current progress for each new data chunk.
99* `Upload timeout` means that no data came during `uploadTimeout`.
100* `Cleaning up temporary file` Here finaly we see cleaning up of the temporary file because of upload timeout reached.
101
102### Available Options
103Pass in non-Busboy options directly to the middleware. These are express-fileupload specific options.
104
105Option | Acceptable&nbsp;Values | Details
106--- | --- | ---
107createParentPath | <ul><li><code>false</code>&nbsp;**(default)**</li><li><code>true</code></ul> | Automatically creates the directory path specified in `.mv(filePathName)`
108uriDecodeFileNames | <ul><li><code>false</code>&nbsp;**(default)**</li><li><code>true</code></ul> | Applies uri decoding to file names if set true.
109safeFileNames | <ul><li><code>false</code>&nbsp;**(default)**</li><li><code>true</code></li><li>regex</li></ul> | 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.<br /><br />**Example #1 (strip slashes from file names):** `app.use(fileUpload({ safeFileNames: /\\/g }))`<br />**Example #2:** `app.use(fileUpload({ safeFileNames: true }))`
110preserveExtension | <ul><li><code>false</code>&nbsp;**(default)**</li><li><code>true</code></li><li><code>*Number*</code></li></ul> | Preserves filename extension when using <code>safeFileNames</code> option. If set to <code>true</code>, will default to an extension length of 3. If set to <code>*Number*</code>, 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.<br /><br />**Example #1 (true):**<br /><code>app.use(fileUpload({ safeFileNames: true, preserveExtension: true }));</code><br />*myFileName.ext* --> *myFileName.ext*<br /><br />**Example #2 (max extension length 2, extension shifted):**<br /><code>app.use(fileUpload({ safeFileNames: true, preserveExtension: 2 }));</code><br />*myFileName.ext* --> *myFileNamee.xt*
111abortOnLimit | <ul><li><code>false</code>&nbsp;**(default)**</li><li><code>true</code></ul> | Returns a HTTP 413 when the file is bigger than the size limit if true. Otherwise, it will add a <code>truncated = true</code> to the resulting file structure.
112responseOnLimit | <ul><li><code>'File size limit has been reached'</code>&nbsp;**(default)**</li><li><code>*String*</code></ul> | Response which will be send to client if file size limit exceeded when abortOnLimit set to true.
113limitHandler | <ul><li><code>false</code>&nbsp;**(default)**</li><li><code>function(req, res, next)</code></li></ul> | User defined limit handler which will be invoked if the file is bigger than configured limits.
114useTempFiles | <ul><li><code>false</code>&nbsp;**(default)**</li><li><code>true</code></ul> | 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.
115tempFileDir | <ul><li><code>String</code>&nbsp;**(path)**</li></ul> | Used with the <code>useTempFiles</code> 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.
116parseNested | <ul><li><code>false</code>&nbsp;**(default)**</li><li><code>true</code></li></ul> | By default, req.body and req.files are flattened like this: <code>{'name': 'John', 'hobbies[0]': 'Cinema', 'hobbies[1]': 'Bike'}</code><br /><br/>When this option is enabled they are parsed in order to be nested like this: <code>{'name': 'John', 'hobbies': ['Cinema', 'Bike']}</code>
117debug | <ul><li><code>false</code>&nbsp;**(default)**</li><li><code>true</code></ul> | Turn on/off upload process logging. Can be usefull for troubleshooting.
118
119# Help Wanted
120Looking for additional maintainers. Please contact `richardgirges [ at ] gmail.com` if you're interested. Pull Requests are welcomed!
121
122# Thanks & Credit
123[Brian White](https://github.com/mscdex) for his stellar work on the [Busboy Package](https://github.com/mscdex/busboy) and the [connect-busboy Package](https://github.com/mscdex/connect-busboy)