2013-05-16 2 views
6

Я использую Flash для записи и выгрузки звука на сервер узлов. Клиентом Flash является вариант jrecorder. Когда пользователь выполнит запись, звук загружается с использованием запроса POST (а не формы, поскольку Flash не может создавать файлы) с аудио ByteArray в качестве данных запроса POST (см. Больше here).Загрузка двоичного файла на Node.js

Я могу получить файл правильно на узловой земле, используя приведенный ниже код, но звук, который выходит, искажен, и вы ничего не слышите. С учетом сказанного, содержимое файла может воспроизводиться VLC и другими игроками + Sox может кодировать его как mp3.

Вот мой код при использовании узла:

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 

Обратите внимание, что я не являюсь экспертом узла так, пожалуйста, если у вас есть какие-либо предложения о том, что я должен использовать вместо сохранения ломтей пожалуйста, напишите примеры кода. Моя главная цель прямо сейчас, чтобы получить это в рабочее состояние, прежде чем изучать другой способ достижения более эффективного в Node (буферов, потоков и т.д.)

ответ

16

Вынимают следующую строку

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

Дорогой сэр, вы УДИВИТЕЛЬНЫЙ! Это сработало, спасибо! Не могу поверить, что я пропустил эту линию. Это была одна из многих итераций, которые я пробовал сегодня. Еще раз спасибо! –

+0

Спасибо за отличный ответ! У меня было так много проблем с этим, и я не понимаю, как это невозможно реализовать по умолчанию, но nvm. Благодаря! –

+0

THX человек работает для меня – cloverink

Смежные вопросы