如何实现将浏览器上传的文件转发到另一个应用的webapi?
我想做这样一个功能: 用户在浏览器选择一个文件,点上传后提交到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))
})
});
}