README.md says:
Use your own body stream for both request and response.
And sources indicate that it supports several types , for example Stream , Buffer , Blob ... and will also try coerce as String for other types.
Below the fragment 3 examples are shown, all work with v1.7.1 or 2.0.0-alpha5 (see also another example further with FormData ):
let fetch = require('node-fetch'); let fs = require('fs'); const stats = fs.statSync("foo.txt"); const fileSizeInBytes = stats.size; // You can pass any of the 3 objects below as body let readStream = fs.createReadStream('foo.txt'); //var stringContent = fs.readFileSync('foo.txt', 'utf8'); //var bufferContent = fs.readFileSync('foo.txt'); fetch('http://httpbin.org/post', { method: 'POST', headers: { "Content-length": fileSizeInBytes }, body: readStream // Here, stringContent or bufferContent would also work }) .then(function(res) { return res.json(); }).then(function(json) { console.log(json); });
Here is foo.txt :
hello world! how do you do?
Note. http://httpbin.org/post responds with JSON, which contains the details of the request.
Result:
{ "args": {}, "data": "hello world!\nhow do you do?\n", "files": {}, "form": {}, "headers": { "Accept": "*/*", "Accept-Encoding": "gzip,deflate", "Connection": "close", "Content-Length": "28", "Host": "httpbin.org", "User-Agent": "node-fetch/1.0 (+https://github.com/bitinn/node-fetch)" }, "json": null, "origin": "86.247.18.156", "url": "http://httpbin.org/post" }
If you need to submit a file as part of a form with a lot of parameters, you can try:
npm install form-data- pass the
FormData object as a body ( FormData is a Stream view, through the CombinedStream library ) - do not skip
header in parameters (unlike above examples)
and then it works:
const formData = new FormData(); formData.append('file', fs.createReadStream('foo.txt')); formData.append('blah', 42); fetch('http://httpbin.org/post', { method: 'POST', body: formData })
Result (just showing what was sent):
----------------------------802616704485543852140629 Content-Disposition: form-data; name="file"; filename="foo.txt" Content-Type: text/plain hello world! how do you do? ----------------------------802616704485543852140629 Content-Disposition: form-data; name="blah" 42 ----------------------------802616704485543852140629--