我有一个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
但也不能正常工作。
我该如何做到这一点? 感谢
我得到一个错误。我需要一些特殊的头文件吗?在响应中,我可以看到'''“错误”:“错误的请求”,“选项”:{“method”:“POST”,“uri”:“....”,“file”:“cHJ1ZWJh == “}'' – David
检查你正在调用的API。他们可能期望以某种方式完成请求。 –
没什么特别的。如果我使用Postman并使用表单数据和文件作为文件发送POST请求,API工作正常。当我检查请求的有效载荷时,我得到了文件的Content-Type:text/plain,但是如果我使用上述机制,它是一个二进制对象,所以我猜测一些不太正确的API并不知道如何解释这个 – David