我有一个在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中的信息。
编辑. 经过一些测试后,我尝试使用真实文件而不是使用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);
});
}
它是有效的! 但当我在multer中切换到memoryStorage,并使用file:req.file.buffer
时,它不起作用。
编辑2: 当我尝试将文件作为流发送时,也尝试了这个方法。
const bufferStream = new stream.PassThrough();
bufferStream.end(req.file.buffer);
我想知道如何实现将bufferStream
作为formData传递,因为目前这样做并不起作用。
谢谢
"error": "Bad Request", "options": { "method":"POST", "uri": "....", "file": "cHJ1ZWJh=="}
。 - David"form": { ... "file": { "type": "Buffer", "data": [ 112, 114, 117, 101,... ]}}"
,并且API会返回相同的错误。 - David