将内存中的文件从Node Express发送到API

我在Node和Express中有一个API,它接收来自客户端的一个文件(Postman正在开发中),我使用multer来获取内存中的文件,如下所示:

router.post('/api/v1/upload', contrl.upload, contrl.uploadFile); 

然后在我的控制器中:

 exports upload = multer({ storage: multer.memoryStorage() }).single('file'); 

现在我可以用req.file.buffer访问文件,但是我想把这个文件发送到另一个API。 我正在使用request-promise-native所以这将是这样的:

 const rp = require('request-promise-native') exports.uploadFile = (req, res) => { const options = { method: 'POST', uri: `${uri}`, form: { file: req.file.buffer } } rp(options) .then(parsedBody => { return res.status(201).send(parsedBody); }) .catch(err => res.status(400).send(err)); } 

为了简单起见,我删除了一些其他参数,但这不起作用,可能是因为Node不知道如何处理req.file.buffer中的信息。

编辑。 好的,经过一些testing,我试图使这个工作与一个真正的文件,而不是使用multer memoryStorage。 所以我得到这个:

 exports upload = multer({ dest: 'uploads/' }).single('file'); 

将文件保存到磁盘,然后

 const request = require('request') exports.uploadFile = (req, res) => { const formData = { file: fs.createReadStream('uploads/' + req.file.filename) } const options = { url: `${uri}` formData } request.post(options, (err, response, body) => { if (err) return res.status(400).send(err); return res.status(201).send(response); }); } 

它的工作原理! 但是,然后当我切换到memoryStorage在multer,而我使用file: req.file.buffer而不是工作。

编辑2:我也试图发送文件作为一个stream在内存中,所以我试了这个

 const bufferStream = new stream.PassThrough(); bufferStream.end(req.file.buffer); 

然后将它传递给formData与file: bufferStream但也无法正常工作。

我怎样才能做到这一点? 谢谢

 const rp = require('request-promise-native') exports.uploadFile = (req, res) => { const options = { method: 'POST', uri: `${uri}`, formData: { file: req.file.buffer } } rp(options) .then(parsedBody => { return res.status(201).send(parsedBody); }) .catch(err => res.status(400).send(err)); } 

这应该可以解决你的问题

 const http = require('http'); exports.uploadFile = (req, res) => { // create new request to reupload file const request = http.request({ port : 80, hostname : '127.0.0.1', method : 'POST', path : '/' }); let result = ''; // grab response from new request request.on('data', (chunk) => { result += chunk; }); // resend response from new request request.on('end', () => { res.status(201).end(result); }); // resend error from new request request.on('error', (err) => { res.status(400).end(err); }); // pipe your file to new request req.file.stream.pipe(request); }; 

使用节点内存streamhttps://www.npmjs.com/package/memory-streams

 var streams = require('memory-streams') , fs = require('fs'); // Pipe var reader = fs.createReadStream('index.js'); var writer = new streams.WritableStream(); reader.pipe(writer); reader.on('readable', function() { // Output the content as a string console.log(writer.toString()); // Output the content as a Buffer console.log(writer.toBuffer()); }); 

我最近遇到过类似的情况,我的程序:web到node到php.I使用“multer”和“request”来解决这个问题,我不使用真正的文件。

  const multer = require('multer') const upload = multer(); const request = require('request'); router.post('/upload', upload.single('img'),(req,res,next) => { let formData = { 'quality':80, //file field need set options 'contentType' and 'filename' for formData 'file':{ value:req.file.buffer, options:{ contentType:req.file.mimetype, filename:req.file.originalname } } } request.post({ url:''/**uploadurl*/, formData },function(err,response,body){res.send(body)}) })