source: frontend/node_modules/form-data/README.md

Last change on this file was 9af201e, checked in by MBK <marija.karapandzova@…>, 11 days ago

Fix frontend appearance

  • Property mode set to 100644
File size: 11.8 KB
Line 
1# Form-Data [![NPM Module](https://img.shields.io/npm/v/form-data.svg)](https://www.npmjs.com/package/form-data) [![Join the chat at https://gitter.im/form-data/form-data](http://form-data.github.io/images/gitterbadge.svg)](https://gitter.im/form-data/form-data)
2
3A library to create readable ```"multipart/form-data"``` streams. Can be used to submit forms and file uploads to other web applications.
4
5The API of this library is inspired by the [XMLHttpRequest-2 FormData Interface][xhr2-fd].
6
7[xhr2-fd]: http://dev.w3.org/2006/webapi/XMLHttpRequest-2/Overview.html#the-formdata-interface
8
9[![Linux Build](https://img.shields.io/travis/form-data/form-data/v4.0.5.svg?label=linux:6.x-12.x)](https://travis-ci.org/form-data/form-data)
10[![MacOS Build](https://img.shields.io/travis/form-data/form-data/v4.0.5.svg?label=macos:6.x-12.x)](https://travis-ci.org/form-data/form-data)
11[![Windows Build](https://img.shields.io/travis/form-data/form-data/v4.0.5.svg?label=windows:6.x-12.x)](https://travis-ci.org/form-data/form-data)
12
13[![Coverage Status](https://img.shields.io/coveralls/form-data/form-data/v4.0.5.svg?label=code+coverage)](https://coveralls.io/github/form-data/form-data?branch=master)
14[![Dependency Status](https://img.shields.io/david/form-data/form-data.svg)](https://david-dm.org/form-data/form-data)
15
16## Install
17
18```
19npm install --save form-data
20```
21
22## Usage
23
24In this example we are constructing a form with 3 fields that contain a string,
25a buffer and a file stream.
26
27``` javascript
28var FormData = require('form-data');
29var fs = require('fs');
30
31var form = new FormData();
32form.append('my_field', 'my value');
33form.append('my_buffer', new Buffer(10));
34form.append('my_file', fs.createReadStream('/foo/bar.jpg'));
35```
36
37Also you can use http-response stream:
38
39``` javascript
40var FormData = require('form-data');
41var http = require('http');
42
43var form = new FormData();
44
45http.request('http://nodejs.org/images/logo.png', function (response) {
46 form.append('my_field', 'my value');
47 form.append('my_buffer', new Buffer(10));
48 form.append('my_logo', response);
49});
50```
51
52Or @mikeal's [request](https://github.com/request/request) stream:
53
54``` javascript
55var FormData = require('form-data');
56var request = require('request');
57
58var form = new FormData();
59
60form.append('my_field', 'my value');
61form.append('my_buffer', new Buffer(10));
62form.append('my_logo', request('http://nodejs.org/images/logo.png'));
63```
64
65In order to submit this form to a web application, call ```submit(url, [callback])``` method:
66
67``` javascript
68form.submit('http://example.org/', function (err, res) {
69 // res – response object (http.IncomingMessage) //
70 res.resume();
71});
72
73```
74
75For more advanced request manipulations ```submit()``` method returns ```http.ClientRequest``` object, or you can choose from one of the alternative submission methods.
76
77### Custom options
78
79You can provide custom options, such as `maxDataSize`:
80
81``` javascript
82var FormData = require('form-data');
83
84var form = new FormData({ maxDataSize: 20971520 });
85form.append('my_field', 'my value');
86form.append('my_buffer', /* something big */);
87```
88
89List of available options could be found in [combined-stream](https://github.com/felixge/node-combined-stream/blob/master/lib/combined_stream.js#L7-L15)
90
91### Alternative submission methods
92
93You can use node's http client interface:
94
95``` javascript
96var http = require('http');
97
98var request = http.request({
99 method: 'post',
100 host: 'example.org',
101 path: '/upload',
102 headers: form.getHeaders()
103});
104
105form.pipe(request);
106
107request.on('response', function (res) {
108 console.log(res.statusCode);
109});
110```
111
112Or if you would prefer the `'Content-Length'` header to be set for you:
113
114``` javascript
115form.submit('example.org/upload', function (err, res) {
116 console.log(res.statusCode);
117});
118```
119
120To use custom headers and pre-known length in parts:
121
122``` javascript
123var CRLF = '\r\n';
124var form = new FormData();
125
126var options = {
127 header: CRLF + '--' + form.getBoundary() + CRLF + 'X-Custom-Header: 123' + CRLF + CRLF,
128 knownLength: 1
129};
130
131form.append('my_buffer', buffer, options);
132
133form.submit('http://example.com/', function (err, res) {
134 if (err) throw err;
135 console.log('Done');
136});
137```
138
139Form-Data can recognize and fetch all the required information from common types of streams (```fs.readStream```, ```http.response``` and ```mikeal's request```), for some other types of streams you'd need to provide "file"-related information manually:
140
141``` javascript
142someModule.stream(function (err, stdout, stderr) {
143 if (err) throw err;
144
145 var form = new FormData();
146
147 form.append('file', stdout, {
148 filename: 'unicycle.jpg', // ... or:
149 filepath: 'photos/toys/unicycle.jpg',
150 contentType: 'image/jpeg',
151 knownLength: 19806
152 });
153
154 form.submit('http://example.com/', function (err, res) {
155 if (err) throw err;
156 console.log('Done');
157 });
158});
159```
160
161The `filepath` property overrides `filename` and may contain a relative path. This is typically used when uploading [multiple files from a directory](https://wicg.github.io/entries-api/#dom-htmlinputelement-webkitdirectory).
162
163For edge cases, like POST request to URL with query string or to pass HTTP auth credentials, object can be passed to `form.submit()` as first parameter:
164
165``` javascript
166form.submit({
167 host: 'example.com',
168 path: '/probably.php?extra=params',
169 auth: 'username:password'
170}, function (err, res) {
171 console.log(res.statusCode);
172});
173```
174
175In case you need to also send custom HTTP headers with the POST request, you can use the `headers` key in first parameter of `form.submit()`:
176
177``` javascript
178form.submit({
179 host: 'example.com',
180 path: '/surelynot.php',
181 headers: { 'x-test-header': 'test-header-value' }
182}, function (err, res) {
183 console.log(res.statusCode);
184});
185```
186
187### Methods
188
189- [_Void_ append( **String** _field_, **Mixed** _value_ [, **Mixed** _options_] )](https://github.com/form-data/form-data#void-append-string-field-mixed-value--mixed-options-).
190- [_Headers_ getHeaders( [**Headers** _userHeaders_] )](https://github.com/form-data/form-data#array-getheaders-array-userheaders-)
191- [_String_ getBoundary()](https://github.com/form-data/form-data#string-getboundary)
192- [_Void_ setBoundary()](https://github.com/form-data/form-data#void-setboundary)
193- [_Buffer_ getBuffer()](https://github.com/form-data/form-data#buffer-getbuffer)
194- [_Integer_ getLengthSync()](https://github.com/form-data/form-data#integer-getlengthsync)
195- [_Integer_ getLength( **function** _callback_ )](https://github.com/form-data/form-data#integer-getlength-function-callback-)
196- [_Boolean_ hasKnownLength()](https://github.com/form-data/form-data#boolean-hasknownlength)
197- [_Request_ submit( _params_, **function** _callback_ )](https://github.com/form-data/form-data#request-submit-params-function-callback-)
198- [_String_ toString()](https://github.com/form-data/form-data#string-tostring)
199
200#### _Void_ append( **String** _field_, **Mixed** _value_ [, **Mixed** _options_] )
201Append data to the form. You can submit about any format (string, integer, boolean, buffer, etc.). However, Arrays are not supported and need to be turned into strings by the user.
202```javascript
203var form = new FormData();
204form.append('my_string', 'my value');
205form.append('my_integer', 1);
206form.append('my_boolean', true);
207form.append('my_buffer', new Buffer(10));
208form.append('my_array_as_json', JSON.stringify(['bird', 'cute']));
209```
210
211You may provide a string for options, or an object.
212```javascript
213// Set filename by providing a string for options
214form.append('my_file', fs.createReadStream('/foo/bar.jpg'), 'bar.jpg');
215
216// provide an object.
217form.append('my_file', fs.createReadStream('/foo/bar.jpg'), { filename: 'bar.jpg', contentType: 'image/jpeg', knownLength: 19806 });
218```
219
220#### _Headers_ getHeaders( [**Headers** _userHeaders_] )
221This method adds the correct `content-type` header to the provided array of `userHeaders`.
222
223#### _String_ getBoundary()
224Return the boundary of the formData. By default, the boundary consists of 26 `-` followed by 24 numbers
225for example:
226```javascript
227--------------------------515890814546601021194782
228```
229
230#### _Void_ setBoundary(String _boundary_)
231Set the boundary string, overriding the default behavior described above.
232
233_Note: The boundary must be unique and may not appear in the data._
234
235#### _Buffer_ getBuffer()
236Return the full formdata request package, as a Buffer. You can insert this Buffer in e.g. Axios to send multipart data.
237```javascript
238var form = new FormData();
239form.append('my_buffer', Buffer.from([0x4a,0x42,0x20,0x52,0x6f,0x63,0x6b,0x73]));
240form.append('my_file', fs.readFileSync('/foo/bar.jpg'));
241
242axios.post('https://example.com/path/to/api', form.getBuffer(), form.getHeaders());
243```
244**Note:** Because the output is of type Buffer, you can only append types that are accepted by Buffer: *string, Buffer, ArrayBuffer, Array, or Array-like Object*. A ReadStream for example will result in an error.
245
246#### _Integer_ getLengthSync()
247Same as `getLength` but synchronous.
248
249_Note: getLengthSync __doesn't__ calculate streams length._
250
251#### _Integer_ getLength(**function** _callback_ )
252Returns the `Content-Length` async. The callback is used to handle errors and continue once the length has been calculated
253```javascript
254this.getLength(function (err, length) {
255 if (err) {
256 this._error(err);
257 return;
258 }
259
260 // add content length
261 request.setHeader('Content-Length', length);
262
263 ...
264}.bind(this));
265```
266
267#### _Boolean_ hasKnownLength()
268Checks if the length of added values is known.
269
270#### _Request_ submit(_params_, **function** _callback_ )
271Submit the form to a web application.
272```javascript
273var form = new FormData();
274form.append('my_string', 'Hello World');
275
276form.submit('http://example.com/', function (err, res) {
277 // res – response object (http.IncomingMessage) //
278 res.resume();
279} );
280```
281
282#### _String_ toString()
283Returns the form data as a string. Don't use this if you are sending files or buffers, use `getBuffer()` instead.
284
285### Integration with other libraries
286
287#### Request
288
289Form submission using [request](https://github.com/request/request):
290
291```javascript
292var formData = {
293 my_field: 'my_value',
294 my_file: fs.createReadStream(__dirname + '/unicycle.jpg'),
295};
296
297request.post({url:'http://service.com/upload', formData: formData}, function (err, httpResponse, body) {
298 if (err) {
299 return console.error('upload failed:', err);
300 }
301 console.log('Upload successful! Server responded with:', body);
302});
303```
304
305For more details see [request readme](https://github.com/request/request#multipartform-data-multipart-form-uploads).
306
307#### node-fetch
308
309You can also submit a form using [node-fetch](https://github.com/bitinn/node-fetch):
310
311```javascript
312var form = new FormData();
313
314form.append('a', 1);
315
316fetch('http://example.com', { method: 'POST', body: form })
317 .then(function (res) {
318 return res.json();
319 }).then(function (json) {
320 console.log(json);
321 });
322```
323
324#### axios
325
326In Node.js you can post a file using [axios](https://github.com/axios/axios):
327```javascript
328const form = new FormData();
329const stream = fs.createReadStream(PATH_TO_FILE);
330
331form.append('image', stream);
332
333// In Node.js environment you need to set boundary in the header field 'Content-Type' by calling method `getHeaders`
334const formHeaders = form.getHeaders();
335
336axios.post('http://example.com', form, {
337 headers: {
338 ...formHeaders,
339 },
340})
341 .then(response => response)
342 .catch(error => error)
343```
344
345## Notes
346
347- ```getLengthSync()``` method DOESN'T calculate length for streams, use ```knownLength``` options as workaround.
348- ```getLength(cb)``` will send an error as first parameter of callback if stream length cannot be calculated (e.g. send in custom streams w/o using ```knownLength```).
349- ```submit``` will not add `content-length` if form length is unknown or not calculable.
350- Starting version `2.x` FormData has dropped support for `node@0.10.x`.
351- Starting version `3.x` FormData has dropped support for `node@4.x`.
352
353## License
354
355Form-Data is released under the [MIT](License) license.
Note: See TracBrowser for help on using the repository browser.