2013-05-16 9 views
6

Używam Flasha do nagrywania i przesyłania dźwięku do serwera węzła. Klient Flash jest odmianą jrecorder. Kiedy użytkownik skończy nagrywanie, dźwięk jest przesyłany za pomocą żądania POST (nie formularza, ponieważ Flash nie może tworzyć plików) z dźwiękiem ByteArray jako danymi żądania POST (więcej informacji: here).Przesyłanie pliku binarnego na Node.js

Jestem w stanie odebrać plik poprawnie na Node-land, używając poniższego kodu, ale dźwięk, który wychodzi, jest zniekształcony i nic nie słychać. Mając to na uwadze, zawartość pliku może być odtwarzana przez VLC i innych graczy + Sox jest w stanie zakodować go jako mp3.

Oto mój kod przy użyciu węzła:

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 
    } 
} 

Teraz, jeśli mogę użyć tego samego klienta Flash i uczynić żądanie POST do serwera Rails i użyć poniższy kod, plik jest doskonale zachowane.

def record 
    file = request.raw_post 

    # Save file to S3 
end 

Należy pamiętać, że nie jestem ekspertem Węzeł więc proszę, jeśli macie jakieś sugestie na temat tego, co powinno się używać zamiast zapisywania fragmentów prosimy zamieszczać przykłady kodu. Moim głównym celem w tej chwili jest, aby to do stanu roboczego przed odkrywania innego sposobu osiągania bardziej efektywnie w węźle (buforów, strumieni, itp)

Odpowiedz

16

Wyjąć następującą linię

req.setEncoding('utf8'); 

Nie jesteś otrzymując dane utf8, otrzymujesz dane o wartości binary.

Użytkownik będzie lepiej wyłączyć za pomocą bufora zamiast ciąg

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

Szanowny Panie jesteś niesamowity! To zadziałało, dzięki! Nie mogę uwierzyć, że tęsknię za tą linią. To był jeden z wielu powtórzeń, które dzisiaj wypróbowałem. Dzięki jeszcze raz! –

+0

Dzięki za wspaniałą odpowiedź! Miałem tak wiele problemów z tym i nie rozumiem, jak to nie może być domyślnie realizowane przez express, ale nvm. Dzięki! –

+0

thx człowiek pracuje dla mnie – cloverink