如何使用带有本地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中的表单数据包。 您可以 手动设置标题/边界 ,但表单数据包将为您处理此问题,并免除您不必担心的细节等。

为了在您的示例中使用表单数据,您将需要执行以下操作:

  1. 创build一个新的FormData对象并append相关的部分:

     let formData = new require('form-data')(); formData.append('key1', 1); formData.append('file', require("fs").createReadStream("/path/to/file.txt")); 
  2. 使用getHeaders函数构build正确的HTTP头文件:

     require('https').request({ headers: formData.getHeaders(), // ... } 
  3. 使用pipe以允许表单数据处理您的数据并将其发送到服务器:

     formData.pipe(query); 

    通过这个改变,你不再需要你对query.writequery.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);