Roc*_*cky 13 post file node.js node-fetch
如何在nodejs/node-fetch POST请求中附加文件.我想调用导入文件的API(.xls或csv).如何使用Node-fetch/nodejs执行此操作.
Ric*_*ler 26
我一直在寻找如何使用node-fetch通过上传文件multipart/form-data,他们的 GitHub 文档实际上展示了如何做到这一点。下面是修改后的示例,显示了如何将缓冲区附加到FormData并上传它。
const FormData = require('form-data');
const form = new FormData();
const buffer = // e.g. `fs.readFileSync('./fileLocation');
const fileName = 'test.txt';
form.append('file', buffer, {
contentType: 'text/plain',
name: 'file',
filename: fileName,
});
fetch('https://httpbin.org/post', { method: 'POST', body: form })
.then(res => res.json())
.then(json => console.log(json));
Run Code Online (Sandbox Code Playgroud)
与像我一样在谷歌上搜索“node-fetch upload file multipart”的其他人分享这个。
Hug*_* M. 23
README.md 说:
在请求和响应上使用本机流作为正文.
而消息来源表明它支持多种类型,比如Stream,Buffer,Blob...也将试着将其转换为String其他类型.
下面的代码段显示了3个示例,所有工作都在使用v1.7.1或2.0.0-alpha5(另请参见下面的其他示例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);
});
Run Code Online (Sandbox Code Playgroud)
这是foo.txt:
hello world!
how do you do?
Run Code Online (Sandbox Code Playgroud)
注意:http://httpbin.org/post使用JSON回复,其中包含有关已发送请求的详细信息.
结果:
{
"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"
}
Run Code Online (Sandbox Code Playgroud)
如果您需要将文件作为包含更多参数的表单的一部分发送,您可以尝试:
npm install form-dataFormData对象作为主体(FormData是一种Stream,通过库)CombinedStream header选项(与上面的例子不同)然后这个工作:
const formData = new FormData();
formData.append('file', fs.createReadStream('foo.txt'));
formData.append('blah', 42);
fetch('http://httpbin.org/post', {
method: 'POST',
body: formData
})
Run Code Online (Sandbox Code Playgroud)
结果(只显示发送的内容):
----------------------------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--
Run Code Online (Sandbox Code Playgroud)