root / HServer / 00.Server / 00.Program / node_modules / multer / README.md
이력 | 보기 | 이력해설 | 다운로드 (9.41 KB)
1 |
# Multer [](https://travis-ci.org/expressjs/multer) [](https://badge.fury.io/js/multer) [](https://github.com/feross/standard) |
---|---|
2 |
|
3 |
Multer is a node.js middleware for handling `multipart/form-data`, which is primarily used for uploading files. It is written |
4 |
on top of [busboy](https://github.com/mscdex/busboy) for maximum efficiency. |
5 |
|
6 |
**NOTE**: Multer will not process any form which is not multipart (`multipart/form-data`). |
7 |
|
8 |
## Translations |
9 |
|
10 |
This README is also available in other languages: |
11 |
|
12 |
- [简体中文](https://github.com/expressjs/multer/blob/master/doc/README-zh-cn.md) (Chinese) |
13 |
|
14 |
## Installation |
15 |
|
16 |
```sh |
17 |
$ npm install --save multer |
18 |
``` |
19 |
|
20 |
## Usage |
21 |
|
22 |
Multer adds a `body` object and a `file` or `files` object to the `request` object. The `body` object contains the values of the text fields of the form, the `file` or `files` object contains the files uploaded via the form. |
23 |
|
24 |
Basic usage example: |
25 |
|
26 |
```javascript |
27 |
var express = require('express') |
28 |
var multer = require('multer') |
29 |
var upload = multer({ dest: 'uploads/' }) |
30 |
|
31 |
var app = express() |
32 |
|
33 |
app.post('/profile', upload.single('avatar'), function (req, res, next) { |
34 |
// req.file is the `avatar` file |
35 |
// req.body will hold the text fields, if there were any |
36 |
}) |
37 |
|
38 |
app.post('/photos/upload', upload.array('photos', 12), function (req, res, next) { |
39 |
// req.files is array of `photos` files |
40 |
// req.body will contain the text fields, if there were any |
41 |
}) |
42 |
|
43 |
var cpUpload = upload.fields([{ name: 'avatar', maxCount: 1 }, { name: 'gallery', maxCount: 8 }]) |
44 |
app.post('/cool-profile', cpUpload, function (req, res, next) { |
45 |
// req.files is an object (String -> Array) where fieldname is the key, and the value is array of files |
46 |
// |
47 |
// e.g. |
48 |
// req.files['avatar'][0] -> File |
49 |
// req.files['gallery'] -> Array |
50 |
// |
51 |
// req.body will contain the text fields, if there were any |
52 |
}) |
53 |
``` |
54 |
|
55 |
In case you need to handle a text-only multipart form, you can use any of the multer methods (`.single()`, `.array()`, `fields()`). Here is an example using `.array()`: |
56 |
|
57 |
```javascript |
58 |
var express = require('express') |
59 |
var app = express() |
60 |
var multer = require('multer') |
61 |
var upload = multer() |
62 |
|
63 |
app.post('/profile', upload.array(), function (req, res, next) { |
64 |
// req.body contains the text fields |
65 |
}) |
66 |
``` |
67 |
|
68 |
## API |
69 |
|
70 |
### File information |
71 |
|
72 |
Each file contains the following information: |
73 |
|
74 |
Key | Description | Note |
75 |
--- | --- | --- |
76 |
`fieldname` | Field name specified in the form | |
77 |
`originalname` | Name of the file on the user's computer | |
78 |
`encoding` | Encoding type of the file | |
79 |
`mimetype` | Mime type of the file | |
80 |
`size` | Size of the file in bytes | |
81 |
`destination` | The folder to which the file has been saved | `DiskStorage` |
82 |
`filename` | The name of the file within the `destination` | `DiskStorage` |
83 |
`path` | The full path to the uploaded file | `DiskStorage` |
84 |
`buffer` | A `Buffer` of the entire file | `MemoryStorage` |
85 |
|
86 |
### `multer(opts)` |
87 |
|
88 |
Multer accepts an options object, the most basic of which is the `dest` |
89 |
property, which tells Multer where to upload the files. In case you omit the |
90 |
options object, the files will be kept in memory and never written to disk. |
91 |
|
92 |
By default, Multer will rename the files so as to avoid naming conflicts. The |
93 |
renaming function can be customized according to your needs. |
94 |
|
95 |
The following are the options that can be passed to Multer. |
96 |
|
97 |
Key | Description |
98 |
--- | --- |
99 |
`dest` or `storage` | Where to store the files |
100 |
`fileFilter` | Function to control which files are accepted |
101 |
`limits` | Limits of the uploaded data |
102 |
`preservePath` | Keep the full path of files instead of just the base name |
103 |
|
104 |
In an average web app, only `dest` might be required, and configured as shown in |
105 |
the following example. |
106 |
|
107 |
```javascript |
108 |
var upload = multer({ dest: 'uploads/' }) |
109 |
``` |
110 |
|
111 |
If you want more control over your uploads, you'll want to use the `storage` |
112 |
option instead of `dest`. Multer ships with storage engines `DiskStorage` |
113 |
and `MemoryStorage`; More engines are available from third parties. |
114 |
|
115 |
#### `.single(fieldname)` |
116 |
|
117 |
Accept a single file with the name `fieldname`. The single file will be stored |
118 |
in `req.file`. |
119 |
|
120 |
#### `.array(fieldname[, maxCount])` |
121 |
|
122 |
Accept an array of files, all with the name `fieldname`. Optionally error out if |
123 |
more than `maxCount` files are uploaded. The array of files will be stored in |
124 |
`req.files`. |
125 |
|
126 |
#### `.fields(fields)` |
127 |
|
128 |
Accept a mix of files, specified by `fields`. An object with arrays of files |
129 |
will be stored in `req.files`. |
130 |
|
131 |
`fields` should be an array of objects with `name` and optionally a `maxCount`. |
132 |
Example: |
133 |
|
134 |
```javascript |
135 |
[ |
136 |
{ name: 'avatar', maxCount: 1 }, |
137 |
{ name: 'gallery', maxCount: 8 } |
138 |
] |
139 |
``` |
140 |
|
141 |
#### `.none()` |
142 |
|
143 |
Accept only text fields. If any file upload is made, error with code |
144 |
"LIMIT\_UNEXPECTED\_FILE" will be issued. This is the same as doing `upload.fields([])`. |
145 |
|
146 |
#### `.any()` |
147 |
|
148 |
Accepts all files that comes over the wire. An array of files will be stored in |
149 |
`req.files`. |
150 |
|
151 |
**WARNING:** Make sure that you always handle the files that a user uploads. |
152 |
Never add multer as a global middleware since a malicious user could upload |
153 |
files to a route that you didn't anticipate. Only use this function on routes |
154 |
where you are handling the uploaded files. |
155 |
|
156 |
### `storage` |
157 |
|
158 |
#### `DiskStorage` |
159 |
|
160 |
The disk storage engine gives you full control on storing files to disk. |
161 |
|
162 |
```javascript |
163 |
var storage = multer.diskStorage({ |
164 |
destination: function (req, file, cb) { |
165 |
cb(null, '/tmp/my-uploads') |
166 |
}, |
167 |
filename: function (req, file, cb) { |
168 |
cb(null, file.fieldname + '-' + Date.now()) |
169 |
} |
170 |
}) |
171 |
|
172 |
var upload = multer({ storage: storage }) |
173 |
``` |
174 |
|
175 |
There are two options available, `destination` and `filename`. They are both |
176 |
functions that determine where the file should be stored. |
177 |
|
178 |
`destination` is used to determine within which folder the uploaded files should |
179 |
be stored. This can also be given as a `string` (e.g. `'/tmp/uploads'`). If no |
180 |
`destination` is given, the operating system's default directory for temporary |
181 |
files is used. |
182 |
|
183 |
**Note:** You are responsible for creating the directory when providing |
184 |
`destination` as a function. When passing a string, multer will make sure that |
185 |
the directory is created for you. |
186 |
|
187 |
`filename` is used to determine what the file should be named inside the folder. |
188 |
If no `filename` is given, each file will be given a random name that doesn't |
189 |
include any file extension. |
190 |
|
191 |
**Note:** Multer will not append any file extension for you, your function |
192 |
should return a filename complete with an file extension. |
193 |
|
194 |
Each function gets passed both the request (`req`) and some information about |
195 |
the file (`file`) to aid with the decision. |
196 |
|
197 |
Note that `req.body` might not have been fully populated yet. It depends on the |
198 |
order that the client transmits fields and files to the server. |
199 |
|
200 |
#### `MemoryStorage` |
201 |
|
202 |
The memory storage engine stores the files in memory as `Buffer` objects. It |
203 |
doesn't have any options. |
204 |
|
205 |
```javascript |
206 |
var storage = multer.memoryStorage() |
207 |
var upload = multer({ storage: storage }) |
208 |
``` |
209 |
|
210 |
When using memory storage, the file info will contain a field called |
211 |
`buffer` that contains the entire file. |
212 |
|
213 |
**WARNING**: Uploading very large files, or relatively small files in large |
214 |
numbers very quickly, can cause your application to run out of memory when |
215 |
memory storage is used. |
216 |
|
217 |
### `limits` |
218 |
|
219 |
An object specifying the size limits of the following optional properties. Multer passes this object into busboy directly, and the details of the properties can be found on [busboy's page](https://github.com/mscdex/busboy#busboy-methods). |
220 |
|
221 |
The following integer values are available: |
222 |
|
223 |
Key | Description | Default |
224 |
--- | --- | --- |
225 |
`fieldNameSize` | Max field name size | 100 bytes |
226 |
`fieldSize` | Max field value size | 1MB |
227 |
`fields` | Max number of non-file fields | Infinity |
228 |
`fileSize` | For multipart forms, the max file size (in bytes) | Infinity |
229 |
`files` | For multipart forms, the max number of file fields | Infinity |
230 |
`parts` | For multipart forms, the max number of parts (fields + files) | Infinity |
231 |
`headerPairs` | For multipart forms, the max number of header key=>value pairs to parse | 2000 |
232 |
|
233 |
Specifying the limits can help protect your site against denial of service (DoS) attacks. |
234 |
|
235 |
### `fileFilter` |
236 |
|
237 |
Set this to a function to control which files should be uploaded and which |
238 |
should be skipped. The function should look like this: |
239 |
|
240 |
```javascript |
241 |
function fileFilter (req, file, cb) { |
242 |
|
243 |
// The function should call `cb` with a boolean |
244 |
// to indicate if the file should be accepted |
245 |
|
246 |
// To reject this file pass `false`, like so: |
247 |
cb(null, false) |
248 |
|
249 |
// To accept the file pass `true`, like so: |
250 |
cb(null, true) |
251 |
|
252 |
// You can always pass an error if something goes wrong: |
253 |
cb(new Error('I don\'t have a clue!')) |
254 |
|
255 |
} |
256 |
``` |
257 |
|
258 |
## Error handling |
259 |
|
260 |
When encountering an error, multer will delegate the error to express. You can |
261 |
display a nice error page using [the standard express way](http://expressjs.com/guide/error-handling.html). |
262 |
|
263 |
If you want to catch errors specifically from multer, you can call the |
264 |
middleware function by yourself. |
265 |
|
266 |
```javascript |
267 |
var upload = multer().single('avatar') |
268 |
|
269 |
app.post('/profile', function (req, res) { |
270 |
upload(req, res, function (err) { |
271 |
if (err) { |
272 |
// An error occurred when uploading |
273 |
return |
274 |
} |
275 |
|
276 |
// Everything went fine |
277 |
}) |
278 |
}) |
279 |
``` |
280 |
|
281 |
## Custom storage engine |
282 |
|
283 |
For information on how to build your own storage engine, see [Multer Storage Engine](https://github.com/expressjs/multer/blob/master/StorageEngine.md). |
284 |
|
285 |
## License |
286 |
|
287 |
[MIT](LICENSE) |