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

我正在使用Flash录制音频并将其上传到节点服务器。Flash客户端是jrecorder的变体。当用户完成录制后,将使用POST请求(而不是表单,因为Flash无法创建文件)来上传音频,并将音频ByteArray作为POST请求的数据(请参见此处的更多信息)。

我可以使用下面的代码在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(缓冲区,流等)中更高效地完成工作的其他方式

回答:

取出以下行

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();

});

});

以上是 在Node.js上上传二进制文件 的全部内容, 来源链接: utcz.com/qa/410797.html

回到顶部