我使用Flash录制音频并将音频上传到节点服务器。 Flash客户端是jrecorder的变体。当用户完成录制时,使用POST请求(不是表单,因为Flash无法创建文件)上传音频,音频ByteArray作为POST请求的数据(请参阅更多here)。
我能够使用下面的代码在Node-land上正确接收文件,但是出来的音频被破坏了,你听不到任何声音。话虽如此,文件的内容可以由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客户端并向Rails服务器发出POST请求并使用下面的代码,则文件将被完美保存。
def record
file = request.raw_post
# Save file to S3
end
请注意,我不是Node专家,所以如果您对我应该使用什么而不是保存块有任何建议,请发布代码示例。我现在的主要目的是在探索在Node(缓冲区,流等)中更有效地实现其他方式之前将其置于工作状态
答案 0 :(得分:17)
取出以下内容
req.setEncoding('utf8');
您没有收到utf8
个数据,而是收到binary
个数据。
最好使用缓冲区而不是字符串
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();
});
});