【问题标题】:Passing a file via POST to NodeJS and then pass to another API without saving on Disk通过 POST 将文件传递给 NodeJS,然后传递给另一个 API,而不保存在磁盘上
【发布时间】:2017-06-01 12:57:37
【问题描述】:

我需要在 React UI(使用 axios)中接收来自用户的文件,使用 Express 通过 POST 将此文件发送到 NodeJS 方法,然后,我需要通过 POST 将相同的文件直接发送到另一个 API(. NET WebAPI)而不保存在磁盘上。我正在尝试直接传递数据文件(req.files.file.data),但 .NET API 无法识别请求中的文件。

是否有可能在“var”中创建一个临时文件并像我从磁盘读取文件时一样发送它?

此示例适用于本地文件:

var formData = {
  form: "{ abn: '666666666' }",
  files: JSON.stringify([
    { 
      name: "file1", 
      type: "1", 
      number: "6666" 
    },
    { 
      name: "file2",
      type: "3", 
      number: "3333" 
    },
  ]),
  // Pass multiple values /w an Array
  attachments: [
    fs.createReadStream(__dirname + '/../file1.txt'),
    fs.createReadStream(__dirname + '/../file2.txt')
   ],
};
var reqs = request.post({url:'https://tms-dev-api.micway.com.au/api/company/file', formData: formData, json: true}, function optionalCallback(err, response, body) {
  if (err) {
    return res.send(err);
  }
  return res.send({
    status: response.statusCode,
    body: body
  });
});

我正在创建一个本地文件,然后发送它;但是,我不认为这是最好的方法。像这样:

router.post('/file', function(req, res) {
  var fstream;
  req.pipe(req.busboy);
  req.busboy.on('file', function (fieldname, file, filename) {
    fstream = fs.createWriteStream(__dirname + '/' + filename);
    file.pipe(fstream);

    var formData = {
    attachments: [
        fs.createReadStream(__dirname + '/' + filename)
      ],
    };
    var reqs = request.post({url:'https://tms-dev-api.micway.com.au/api/company/file', formData: formData, json: true}, function optionalCallback(err, response, body) {
      if (err) {
        return res.send(err);
      }

      console.log({
        status: response.statusCode,
        body: body
      })

      return res.send({
        status: response.statusCode,
        body: body
      });
    });
  });
});

谢谢!

【问题讨论】:

  • 你找到解决方案了吗?我有一个非常相似的用例,我不想在将文件发送到其他服务器之前将其保存在服务器上?
  • 您好,有人有解决方案吗??

标签: javascript node.js express asp.net-web-api axios


【解决方案1】:

我认为有效的解决方案是在执行期间保存它,读取和操作 other 中的数据以将其发送到其他 API,并在收到响应后立即将其从磁盘中删除。

【讨论】:

    【解决方案2】:

    创建 PassThrough() 流而不是将文件写入磁盘:

    const { PassThrough } = require('stream')
    
    ...
    
    fstream = new PassThrough()
    file.pipe(fstream);
    

    【讨论】:

      猜你喜欢
      • 2018-10-02
      • 2022-07-28
      • 1970-01-01
      • 1970-01-01
      • 2019-07-25
      • 2020-04-01
      • 2022-10-07
      • 1970-01-01
      • 2016-01-31
      相关资源
      最近更新 更多