如何使用带有本地Node.js https.request的multipart / form-data头来上传文件?
我试图从node.js使用本地https.request从我的电脑上传文件。 我的代码如下所示:
let query = require('https').request({ hostname: 'somehost.com', path: '/path/to/upload', headers: {'Content-Type': 'multipart/form-data'}, method: 'POST' }, (res) => { let data = ''; res.on("data", (chunk) => { data += chunk.toString('utf8'); }); res.on('end', () => { console.log("data"); }) }); query.on("error", (e) => { console.error(e); }); query.write(Buffer[ {key1: 1, file: require("fs").createReadStream("/path/to/file.txt")} ]); // I don't know how to put here query.end();
我没有得到主机的任何回应,file upload失败。 我怎样才能做到这一点?
当上传multipart / form-data时, Content-Type
头部必须包含一个边界 ,以便表示每个“部分”在发布数据中的位置。 为了设置Multipart Content-Type的边界,您可以使用NPM中的表单数据包。 您可以 手动设置标题/边界 ,但表单数据包将为您处理此问题,并免除您不必担心的细节等。
为了在您的示例中使用表单数据,您将需要执行以下操作:
-
创build一个新的
FormData
对象并append
相关的部分:let formData = new require('form-data')(); formData.append('key1', 1); formData.append('file', require("fs").createReadStream("/path/to/file.txt"));
-
使用
getHeaders
函数构build正确的HTTP头文件:require('https').request({ headers: formData.getHeaders(), // ... }
-
使用
pipe
以允许表单数据处理您的数据并将其发送到服务器:formData.pipe(query);
通过这个改变,你不再需要你对
query.write
或query.end
的调用 – 调用pipe
来处理这个问题。
为了完整起见,下面是我描述的变化的最终代码:
let formData = new require('form-data')(); formData.append('key1', 1); formData.append('file', require("fs").createReadStream("/path/to/file.txt")); let query = require('https').request({ hostname: 'somehost.com', path: '/path/to/upload', method: 'POST', headers: formData.getHeaders() }, (res) => { let data = ''; res.on("data", (chunk) => { data += chunk.toString('utf8'); }); res.on('end', () => { console.log(data); }) }); query.on("error", (e) => { console.error(e); }); formData.pipe(query);