1 | # express-fileupload
|
2 | Simple 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
|
12 | npm install --save express-fileupload
|
13 |
|
14 | # With Yarn
|
15 | yarn add express-fileupload
|
16 | ```
|
17 |
|
18 | # Usage
|
19 | When you upload a file, the file will be accessible from `req.files`.
|
20 |
|
21 | Example:
|
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
|
26 | app.post('/upload', function(req, res) {
|
27 | console.log(req.files.foo); // the uploaded file object
|
28 | });
|
29 | ```
|
30 |
|
31 | The **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
|
54 | Pass in Busboy options directly to the express-fileupload middleware. [Check out the Busboy documentation here.](https://github.com/mscdex/busboy#api)
|
55 |
|
56 | ```javascript
|
57 | app.use(fileUpload({
|
58 | limits: { fileSize: 50 * 1024 * 1024 },
|
59 | }));
|
60 | ```
|
61 |
|
62 | ### Using useTempFile Options
|
63 | Use 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
|
70 | app.use(fileUpload({
|
71 | useTempFiles : true,
|
72 | tempFileDir : '/tmp/'
|
73 | }));
|
74 | ```
|
75 | ### Using debug option
|
76 |
|
77 | You can set `debug` option to `true` to see some logging about upload process.
|
78 | In this case middleware uses `console.log` and adds `Express-file-upload` prefix for outputs.
|
79 |
|
80 | It will show you whether the request is illigable and also common events triggered during upload.
|
81 | That can be really usfull for troubleshhoting and ***we recommend to attach debug output to each issue on Github***.
|
82 |
|
83 | ***Output example:***
|
84 |
|
85 | ```
|
86 | Express-file-upload: Temporary file path is /node/express-fileupload/test/temp/tmp-16-1570084843942
|
87 | Express-file-upload: New upload started testFile->car.png, bytes:0
|
88 | Express-file-upload: Uploading testFile->car.png, bytes:21232...
|
89 | Express-file-upload: Uploading testFile->car.png, bytes:86768...
|
90 | Express-file-upload: Upload timeout testFile->car.png, bytes:86768
|
91 | Express-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
|
103 | Pass in non-Busboy options directly to the middleware. These are express-fileupload specific options.
|
104 |
|
105 | Option | Acceptable Values | Details
|
106 | --- | --- | ---
|
107 | createParentPath | <ul><li><code>false</code> **(default)**</li><li><code>true</code></ul> | Automatically creates the directory path specified in `.mv(filePathName)`
|
108 | uriDecodeFileNames | <ul><li><code>false</code> **(default)**</li><li><code>true</code></ul> | Applies uri decoding to file names if set true.
|
109 | safeFileNames | <ul><li><code>false</code> **(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 }))`
|
110 | preserveExtension | <ul><li><code>false</code> **(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*
|
111 | abortOnLimit | <ul><li><code>false</code> **(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.
|
112 | responseOnLimit | <ul><li><code>'File size limit has been reached'</code> **(default)**</li><li><code>*String*</code></ul> | Response which will be send to client if file size limit exceeded when abortOnLimit set to true.
|
113 | limitHandler | <ul><li><code>false</code> **(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.
|
114 | useTempFiles | <ul><li><code>false</code> **(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.
|
115 | tempFileDir | <ul><li><code>String</code> **(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.
|
116 | parseNested | <ul><li><code>false</code> **(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>
|
117 | debug | <ul><li><code>false</code> **(default)**</li><li><code>true</code></ul> | Turn on/off upload process logging. Can be usefull for troubleshooting.
|
118 |
|
119 | # Help Wanted
|
120 | Looking 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)
|