将内存中的文件从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)}) })