nodesync

node scripts for watching changed files and dirs then post them to remote server

node-sync

监测本地文件夹,自动将变化的文件上传到服务器的指定目录下

npm install -g node-sync

In this example we are constructing a form with 3 fields that contain a string, a buffer and a file stream.

var FormData = require('form-data');
var fs = require('fs');
 
var form = new FormData();
form.append('my_field', 'my value');
form.append('my_buffer', new Buffer(10));
form.append('my_file', fs.createReadStream('/foo/bar.jpg'));

Also you can use http-response stream:

var FormData = require('form-data');
var http = require('http');
 
var form = new FormData();
 
http.request('http://nodejs.org/images/logo.png', function(response) {
  form.append('my_field', 'my value');
  form.append('my_buffer', new Buffer(10));
  form.append('my_logo', response);
});

Or @mikeal's request stream:

var FormData = require('form-data');
var request = require('request');
 
var form = new FormData();
 
form.append('my_field', 'my value');
form.append('my_buffer', new Buffer(10));
form.append('my_logo', request('http://nodejs.org/images/logo.png'));

In order to submit this form to a web application, call submit(url, [callback]) method:

form.submit('http://example.org/', function(errres) {
  // res – response object (http.IncomingMessage)  // 
  res.resume(); // for node-0.10.x 
});
 

For more advanced request manipulations submit() method returns http.ClientRequest object, or you can choose from one of the alternative submission methods.

You can use node's http client interface:

var http = require('http');
 
var request = http.request({
  method: 'post',
  host: 'example.org',
  path: '/upload',
  headers: form.getHeaders()
});
 
form.pipe(request);
 
request.on('response', function(res) {
  console.log(res.statusCode);
});

Or if you would prefer the 'Content-Length' header to be set for you:

form.submit('example.org/upload', function(errres) {
  console.log(res.statusCode);
});

To use custom headers and pre-known length in parts:

var CRLF = '\r\n';
var form = new FormData();
 
var options = {
  header: CRLF + '--' + form.getBoundary() + CRLF + 'X-Custom-Header: 123' + CRLF + CRLF,
  knownLength: 1
};
 
form.append('my_buffer', buffer, options);
 
form.submit('http://example.com/', function(errres) {
  if (err) throw err;
  console.log('Done');
});

Form-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:

someModule.stream(function(errstdoutstderr) {
  if (err) throw err;
 
  var form = new FormData();
 
  form.append('file', stdout, {
    filename: 'unicycle.jpg',
    contentType: 'image/jpg',
    knownLength: 19806
  });
 
  form.submit('http://example.com/', function(errres) {
    if (err) throw err;
    console.log('Done');
  });
});

For 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:

form.submit({
  host: 'example.com',
  path: '/probably.php?extra=params',
  auth: 'username:password'
}, function(errres) {
  console.log(res.statusCode);
});
  • getLengthSync() method DOESN'T calculate length for streams, use knownLength options as workaround.
  • If it feels like FormData hangs after submit and you're on node-0.10, please check [Compatibility with Older Node Versions][streams2-thing]
  • Add new streams (0.10) support and try really hard not to break it for 0.8.x.

Form-Data is licensed under the MIT license.