如何实现将浏览器上传的文件转发到另一个应用的webapi?
发布于 2 年前 作者 MitchellZhang 3021 次浏览 来自 问答

我想做这样一个功能: 用户在浏览器选择一个文件,点上传后提交到http://localhost:3000/rest/file/post,然后将文件转发到http://www.xxxxxxxx.com/rest/file/post去。 我现在的代码是这样的:

var express = require('express');
var superAgent = require('superagent');
var port = process.env.PORT || 3000;
var app = express();

app.listen(port);
app.post('/rest/file/post', (req, res) => {
    var sreq = superAgent.post('http://www.xxxxxxxx.com/rest/file/post');
    sreq.query(req.query)
    //这里怎样取到文件数据并且转发???    
    sreq.pipe(res);
    sreq.on('end', function () {
    });
});

我现在能做到上传文件到本地硬盘,也能做到将本地文件返回给浏览器。 如何将文件上传之后读到内存然后再转发到另一个webpi地址?

3 回复

把一个可读流直接转发到另一个可写流

Nginx代理性能会好一些?非要用Node的话楼上的方法就可以,去看一下Stream怎么用。。。

我反正是这么处理的,也就是读取文件再上传,流的话,暂时没研究

var fs = require('fs');
var multiparty = require('multiparty');
var request = require('request');
var isJSON = require('is-json');

module.exports = function uploadProxy(req, res, next) {
  var form = new multiparty.Form({
    autoFields: true,
  });

  form.parse(req, function parseDone(err, fields, files) {
    if (!files.file) {
      return res.status(400).json({ message: '文件无法获取' });
    }

    var url = 'your upload url';
    var formData = {
      a: 'bcd',
      file: {
        value:  fs.createReadStream(files.file[0].path),
        options: {
          filename: files.file[0].originalFilename,
          contentType: files.file[0].headers['content-type'],
        },
      },
    }

    request.post({url: url, formData: formData}, function postDone(err, response, body) {
      if (err) {
        return next(err);
      }
      console.log('upload file response body => ', body);
      if (!isJSON(body)) return res.status(500).json({ message: '上传失败' });
      res.json(JSON.parse(body))
    })
  });
}
回到顶部