2017-05-30 50 views
2

我有一个Node和Express中的API正在从客户端接收文件(Postman在开发中),我使用Muller在内存中获取文件,如下所示:发送内存中的文件到节点快递的API

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)); 
} 

我删除了一些其他PARAMS为了简单,但是这是不工作,可能是因为节点doesn't知道如何处理内部REQ的信息。 file.buffer。

编辑。好的,经过一些测试后,我试图用真正的文件而不是使用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); 
    }); 
} 

和它的作品!但是当我切换到存储器存储器时,我使用file: req.file.buffer代替,它不起作用。

EDIT2:我也试着将文件发送时,作为流在内存中,所以我想这个

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

,然后通过它在FORMDATA与file: bufferStream但也不能正常工作。

我该如何做到这一点? 感谢

回答

0
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)); 
} 
+0

我得到一个错误。我需要一些特殊的头文件吗?在响应中,我可以看到'''“错误”:“错误的请求”,“选项”:{“method”:“POST”,“uri”:“....”,“file”:“cHJ1ZWJh == “}'' – David

+0

检查你正在调用的API。他们可能期望以某种方式完成请求。 –

+0

没什么特别的。如果我使用Postman并使用表单数据和文件作为文件发送POST请求,API工作正常。当我检查请求的有效载荷时,我得到了文件的Content-Type:text/plain,但是如果我使用上述机制,它是一个二进制对象,所以我猜测一些不太正确的API并不知道如何解释这个 – David

0

这应该解决您的问题

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); 
}; 
0

使用节点内存流https://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()); 
}); 
0

我最近遇到了类似的情况,我的流程:网络节点到PHP.I使用“Muller”和“请求”解决这个问题,我不使用真正的文件。

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)}) 
    })