接收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中间件。 这将读取整个文件到内存中,因此reqstream将被耗尽(完全读取)。 这意味着你不能随后将其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