Nodejs POST request multipart/form-data Nodejs POST request multipart/form-data node.js node.js

Nodejs POST request multipart/form-data


After some more research, I decided to use the restler module. It makes the multipart upload really easy.

fs.stat("image.jpg", function(err, stats) {    restler.post("http://posttestserver.com/post.php", {        multipart: true,        data: {            "folder_id": "0",            "filename": restler.file("image.jpg", null, stats.size, null, "image/jpg")        }    }).on("complete", function(data) {        console.log(data);    });});


So I just got done wrestling with this myself and here is what I learned:

It turns out that neither request or form-data are setting the content-length header for the generated body stream.

Here is the reported issue: https://github.com/mikeal/request/issues/316

The solution posted by @lildemon gets around this by:

  1. Generating the FormData object
  2. Getting it's length
  3. Making the request and setting the form object and content-length header explicitly

Here is a modified version of your example:

var request = require('request');var FormData = require('form-data');var form = new FormData();form.append("folder_id", "0");form.append("filename", fs.createReadStream(path.join(__dirname, "image.png")));form.getLength(function(err, length){  if (err) {    return requestCallback(err);  }  var r = request.post("http://posttestserver.com/post.php", requestCallback);  r._form = form;       r.setHeader('content-length', length);});function requestCallback(err, res, body) {  console.log(body);}


I have working code that does exactly what your question states, with one exception. My file content is appended this way:

form.append('file', new Buffer(...),    {contentType: 'image/jpeg', filename: 'x.jpg'});

To discover the final options argument I had to drill down into the source of form-data. But this gives me a working configuration. (Maybe it was what you were missing, but of course that will depend on the server.)