2013-05-16 12 views
6

Uso Flash per registrare e caricare l'audio su un server nodo. Il client Flash è una variazione di jrecorder. Quando l'utente ha terminato di registrare, l'audio viene caricato utilizzando una richiesta POST (non un modulo perché Flash non può creare file) con l'audio ByteArray come i dati della richiesta POST (vedere più here).Caricamento file binario su Node.js

Sono in grado di ricevere il file correttamente su Node-land utilizzando il codice riportato di seguito ma l'audio che viene fuori viene alterato e non si sente nulla. Detto questo, il contenuto del file può essere riprodotto da VLC e altri lettori + Sox è in grado di codificarlo come un mp3.

Ecco il mio codice quando si utilizza 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 
    } 
} 

Ora, se io uso lo stesso client Flash e fare la richiesta POST a un server Rails e utilizzare il codice qui sotto, il file viene salvato perfettamente.

def record 
    file = request.raw_post 

    # Save file to S3 
end 

Nota che io non sono un esperto di nodo quindi per favore se avete qualche suggerimento su quello che dovrei usare invece di salvare i pezzi si prega di inviare esempi di codice. Il mio obiettivo principale in questo momento è quello di ottenere questo a uno stato funzionante prima di esplorare altro modo di realizzare in modo più efficiente nel Nodo (tamponi, corsi d'acqua, ecc)

risposta

16

estrarre la seguente riga

req.setEncoding('utf8'); 

Non sei ricevendo i dati utf8, si ricevono i dati binary.

Si sarebbe meglio utilizzare un buffer invece che una stringa

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

Caro signore si è IMPRESSIONANTE! Ha funzionato, grazie! Non posso credere di aver perso quella linea. Era una delle tante iterazioni che ho provato oggi. Grazie ancora! –

+0

Grazie per l'ottima risposta! Ho avuto così tanti problemi con questo e non capisco come questo non possa essere implementato di default da espresso, ma nvm. Grazie! –

+0

l'uomo che lavora per me – cloverink