接收wav文件并将其写入Node / Express Server上的磁盘
我使用以下方式将audio文件发送到Node / Express服务器:
curl -X POST -H "Content-Type: audio/wav" --data-binary @"hello.wav" http://127.0.0.1:3000/extract_indicators/audio/darksigma
我正在使用下面的代码:
... app.use(bodyParser.raw({ type: 'audio/wav', limit: '50mb' })); ... app.post('/extract_indicators/audio/:user_id', function (req, res) { console.log("RECIEVED AUDIO TO EXTRACT INDICATORS: ", req.body); var writeStream = fs.createWriteStream('sample.wav'); req.pipe(writeStream); res.sendStatus(200); });
但sample.wav
文件最终是空的。 有任何想法吗?
问题是你使用body-parser
中间件。 这将读取整个文件到内存中,因此req
stream将被耗尽(完全读取)。 这意味着你不能随后将其pipe理到一个文件(因为所有的数据已被读取)。
你有两个select:
- 完全不要使用
body-parser
,并将请求stream传送到文件(删除app.use(bodyParser.raw(...))
,其余代码将按预期工作)。 -
将
body-parser
放入并将req.body
写入文件:app.post('/extract_indicators/audio/:user_id', function (req, res) { fs.writeFile('sample.wav', req.body, function(err) { res.sendStatus(err ? 500 : 200); }); });
两者都有pro和con:不使用body-parser
意味着你必须自己检查正确的内容types,并限制允许上传的数据量(也许stream-meter
在那里可能是有用的)。
但是使用 body-parser
意味着所有上传的文件都会首先被完全读入内存,尤其是对于大量的请求,会耗尽服务器的内存。
或者,你可以考虑允许file upload为multipart/form-data
,所以你可以使用像multer
这样的configuration。
cURL也可以处理这个问题:
curl -XPOST -F file@hello.wav http://127.0.0.1:3000/extract_indicators/audio/darksigma