【问题标题】:Uploading binary file on Node.js在 Node.js 上上传二进制文件
【发布时间】:2013-05-12 00:39:30
【问题描述】:

我正在使用 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 中更有效地完成任务的方法(缓冲区、流等)之前让它进入工作状态

【问题讨论】:

    标签: flash node.js upload binary express


    【解决方案1】:

    取出下面一行

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

    【讨论】:

    • 亲爱的先生,您太棒了!那行得通,谢谢!我不敢相信我错过了那条线。这是我今天尝试的众多迭代之一。再次感谢!
    • 感谢您的精彩回答!我对此有很多问题,我不明白这怎么不能默认由 express 实现,但是 nvm。谢谢!
    • 那么当我使用表单数据作为我的有效载荷时,它不会转换为二进制吗?
    • @sakib11 你能破解这个吗?我无法上传镶木地板文件。我相信当我上传它时它的编码发生了变化。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-13
    • 2021-09-18
    • 1970-01-01
    • 1970-01-01
    • 2013-08-29
    • 2011-07-21
    • 2018-06-11
    相关资源
    最近更新 更多