在Node.js中使用POST请求上传文件

Jag*_*agi 70 multipartform-data http-post node.js

我在Node.js中使用POST请求上传文件时遇到问题.我必须使用request模块来完成它(没有外部的npms).服务器需要使用file包含文件数据的字段的多部分请求.在没有使用任何外部模块的情况下,在Node.js中做起来似乎很容易.

我尝试过使用这个例子,但没有成功:

request.post({
  uri: url,
  method: 'POST',
  multipart: [{
    body: '<FILE_DATA>'
  }]
}, function (err, resp, body) {
  if (err) {
    console.log('Error!');
  } else {
    console.log('URL: ' + body);
  }
});
Run Code Online (Sandbox Code Playgroud)

Leo*_*tny 101

看起来你已经在使用request模块了.

在这种情况下,你需要发布的multipart/form-data就是使用它的form功能:

var req = request.post(url, function (err, resp, body) {
  if (err) {
    console.log('Error!');
  } else {
    console.log('URL: ' + body);
  }
});
var form = req.form();
form.append('file', '<FILE_DATA>', {
  filename: 'myfile.txt',
  contentType: 'text/plain'
});
Run Code Online (Sandbox Code Playgroud)

但如果您想从文件系统发布一些现有文件,那么您可以将其作为可读流传递:

form.append('file', fs.createReadStream(filepath));
Run Code Online (Sandbox Code Playgroud)

request 将自己提取所有相关的元数据.

有关发布multipart/form-data查看node-form-data模块的更多信息,该模块由内部使用request.

  • 当我学习节点和请求模块时,我很困惑为什么在调用`post`方法后可以修改表单.埋在[请求](https://github.com/request/request)文档中的解释是 - "可以修改_形式,直到请求在事件的下一个循环中被触发 - 循环_". (79认同)
  • 在使用表单和form.append时,我一直得到'[错误:写完后]',有谁知道为什么? (2认同)

Cla*_*vin 19

实现的formData字段的未记录功能request是将选项传递给form-data它使用的模块的能力:

request({
  url: 'http://example.com',
  method: 'POST',
  formData: {
    'regularField': 'someValue',
    'regularFile': someFileStream,
    'customBufferFile': {
      value: fileBufferData,
      options: {
        filename: 'myfile.bin'
      }
    }
  }
}, handleResponse);
Run Code Online (Sandbox Code Playgroud)

如果您需要避免调用requestObj.form()但需要将缓冲区上载为文件,这非常有用.该form-data模块还接受contentType(MIME类型)和knownLength选项.

此更改已于2014年10月添加(因此在询问此问题后2个月),因此现在可以安全使用(2017年以上).这相当于版本v2.46.0或以上request.