Node.js 接收wav文件并将其写入Node/Express服务器上的磁盘
我正在使用以下命令将音频文件发送到我的Node/Express服务器:Node.js 接收wav文件并将其写入Node/Express服务器上的磁盘,node.js,audio,express,Node.js,Audio,Express,我正在使用以下命令将音频文件发送到我的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' })); ... a
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文件最终是空的。有什么想法吗?问题在于您对主体解析器中间件的使用。这将把整个文件读入内存,因此,req流将被完全读取。这意味着您以后无法将其通过管道传输到文件,因为所有数据都已被读取 您有两个选择: 根本不使用主体解析器,将请求流通过管道传输到文件remove app.usebodyParser.raw。。。剩下的代码将按预期工作; 将主体解析器保留在中,并将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);
});
});
两者都有优点和缺点:不使用主体解析器意味着您必须自己检查正确的内容类型,并限制允许上传的数据量,这可能会很有用
但使用主体解析器意味着所有上传的文件都会首先完全读入内存,尤其是对于大量请求,这会耗尽服务器的内存
可选地,您可以考虑将文件作为多部分/表单数据上载,这样您就可以使用类似于可配置的东西。 cURL也可以处理这个问题:
curl -XPOST -F file@hello.wav http://127.0.0.1:3000/extract_indicators/audio/darksigma
问题在于主体解析器中间件的使用。这将把整个文件读入内存,因此,req流将被完全读取。这意味着您以后无法将其通过管道传输到文件,因为所有数据都已被读取 您有两个选择: 根本不使用主体解析器,将请求流通过管道传输到文件remove app.usebodyParser.raw。。。剩下的代码将按预期工作; 将主体解析器保留在中,并将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);
});
});
两者都有优点和缺点:不使用主体解析器意味着您必须自己检查正确的内容类型,并限制允许上传的数据量,这可能会很有用
但使用主体解析器意味着所有上传的文件都会首先完全读入内存,尤其是对于大量请求,这会耗尽服务器的内存
可选地,您可以考虑将文件作为多部分/表单数据上载,这样您就可以使用类似于可配置的东西。 cURL也可以处理这个问题:
curl -XPOST -F file@hello.wav http://127.0.0.1:3000/extract_indicators/audio/darksigma
解决方案不起作用。如果没有主体解析器,就没有req.body。@dev\u在使用主体解析器时,原始问题将req传输到一个可写流。我的回答解释了为什么这行不通。如果删除body-parser.Solution不起作用,它不会声明或暗示req.body将存在。如果没有主体解析器,就没有req.body。@dev\u在使用主体解析器时,原始问题将req传输到一个可写流。我的回答解释了为什么这行不通。如果删除主体解析器,它不会声明或暗示req.body将存在。