2013-05-16 8 views
6

Ich verwende Flash, um Audio auf einen Knotenserver aufzuzeichnen und hochzuladen. Der Flash-Client ist eine Variante von jrecorder. Wenn der Benutzer die Aufzeichnung beendet hat, wird das Audio mithilfe einer POST-Anforderung (kein Formular, da Flash keine Dateien erstellen kann) mit dem Audio-ByteArray als Daten der POST-Anforderung hochgeladen (siehe auch here).Hochladen der Binärdatei auf Node.js

Ich kann die Datei korrekt auf Node-Land mit dem folgenden Code empfangen, aber das Audio, das herauskommt, ist verstümmelt und Sie können nichts hören. Der Inhalt der Datei kann von VLC und anderen Spielern gespielt werden + Sox kann sie als MP3 kodieren.

Hier ist mein Code bei der Verwendung von Knoten:

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

Nun, wenn ich den gleichen Flash-Client verwenden und die POST-Anforderung an einen Server Rails machen und den Code unten verwenden, die Datei perfekt gespeichert wird.

def record 
    file = request.raw_post 

    # Save file to S3 
end 

Bitte beachte, dass ich kein Experte bin Knoten also bitte, wenn Sie irgendwelche Vorschläge haben, was soll ich verwenden, anstatt die Stücke des Sparens bitte Code-Beispiele stellen. Mein Hauptziel ist es gerade jetzt diese in einen funktionierenden Zustand zu erhalten, bevor andere Art und Weise zu erkunden effizienter in Knoten erreicht (Puffer, Bäche, etc.)

Antwort

16

Nehmen Sie die folgende Zeile

req.setEncoding('utf8'); 

Du bist nicht Empfangen utf8 Daten erhalten Sie binary Daten.

Sie wäre besser dran, einen Puffer anstelle einer Zeichenfolge mit

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

Sehr geehrter Herr Sie sind super! Das hat funktioniert, danke! Ich kann nicht glauben, dass ich diese Linie verpasst habe. Es war eine der vielen Iterationen, die ich heute versuchte. Danke noch einmal! –

+0

Danke für die tolle Antwort! Ich hatte so viele Probleme damit und ich verstehe nicht, wie dies nicht per Express, sondern nvm standardmäßig umgesetzt werden könnte. Vielen Dank! –

+0

thx Mann arbeitet für mich – cloverink