在Node.js上上传二进制文件

我正在使用Flashloggingaudio并将其上传到节点服务器。 Flash客户端是jrecorder的变体。 当用户完成录制时,使用POST请求(不是表单,因为Flash不能创build文件)使用audioByteArray作为POST请求的数据(请参阅此处更多信息 )上传audio。

我能够使用下面的代码在Node-land上正确接收文件,但是出来的audio被破坏,你什么都听不到。 这样说,文件的内容可以播放VLC和其他播放器+ Sox能够编码为MP3。

这是我使用Node时的代码:

var express = require('express'); var app = express(); app.use (function(req, res, next) { req.rawBody = ''; req.setEncoding('utf8'); if(req.method.toLowerCase() == "post") { req.on('data', function(chunk) { req.rawBody += chunk }); req.on('end', function() { done(req, res); }); } next(); }); function done(req, res) { fs.writeFile('abc.wav', req.rawBody, 'binary', function(err){ if (err) throw err; // Save file to S3 } } 

现在,如果我使用相同的Flash客户端,并将POST请求发送到Rails服务器并使用下面的代码,那么该文件将完全保存。

 def record file = request.raw_post # Save file to S3 end 

请注意,我不是一个节点专家,所以请如果您有什么build议我应该使用,而不是保存块请张贴代码示例。 我现在的主要目的是在探索在Node中更高效地完成其他方式(缓冲区,stream等)之前,将其置于工作状态。

拿出下面一行

 req.setEncoding('utf8'); 

你没有收到utf8数据,你正在接收binary数据。

你最好使用缓冲区而不是string

 app.use(function(req, res, next) { var data = new Buffer(''); req.on('data', function(chunk) { data = Buffer.concat([data, chunk]); }); req.on('end', function() { req.rawBody = data; next(); }); });