2012-01-11 12 views
13

Sto cercando di utilizzare NodeJS di agire come server per costruire un'API.Utilizzare NodeJS caricare il file in una chiamata API

Idealmente mi piacerebbe che ci sia un endpoint API per inviare una serie di informazioni, nonché un file che può essere salvato nel sistema di file.

maggior parte degli esempi che ho visto sono per l'invio di un file tramite un modulo, però mi piacerebbe fare questo attraverso una richiesta POST.

Qualcuno sa come avrei potuto raggiungere questo obiettivo (se è possibile)?

Al momento quello che vorrei realizzare è qualcosa lungo le seguenti linee:

app.post('/Some/Endpoint/', controller.handleSomeEndpoint, function(request, response) { 
    response.send('Finished Request'); 
}); 

exports.handleSomeEndpoint = function(request, response, next) { 
    var bodyarr = [] 
    request.on('data', function(chunk){ 
     bodyarr.push(chunk); 
    }) 
    request.on('end', function(){ 
     console.log(bodyarr.join('')); 
    }) 
} 

Ma i dati e alla fine non vengono mai chiamati se corro un comando ricciolo lungo le linee di:

curl http://127.0.0.1:5000/Some/Endpoint/ -F '[email protected]_file' 

Cheers, Matt

+1

Un modulo è una richiesta POST, quando si inviano file. Il lato nodo delle cose non dovrebbe essere diverso. – Paul

+1

Ma come creare un req.files senza un modulo? Qualche esempio? –

risposta

4

La risposta sembra essere che expressJS non usa lo stesso metodo di gestire un file posto come il modulo HTTP in nodejs.

Tutto ciò che era necessario era compresa una directory per i file da scrivere a:

app.use(express.bodyParser({uploadDir:'./uploads'})); 

che ho trovato qui:

http://www.hacksparrow.com/handle-file-uploads-in-express-node-js.html

+0

In questo modo ogni volta che ti mando un file attraverso una richiesta POST, lo accetti e lo salverai nel tuo ./uploads. Non penso che sia sicuro. – nick

+0

Non penso sia pericoloso, nel senso che è una memoria temporanea, non permanente, il che significa che mentre è accettata, non significa che sia memorizzata in modo permanente o utilizzata. La richiesta dovrebbe essere autenticata (che nel mio caso lo è). –

+0

Ma come passare un req.files se non viene utilizzato alcun modulo? Sto cercando di caricare il file solo tramite API. –

0

Il codice dovrebbe funzionare bene; è l'uso del ricciolo che è sbagliato. Prova a modificare:

$ curl -X POST --data-binary @test_file http://localhost:8080 
+0

questo effettivamente incasina il file ... – Devenv

2

vorrei suggerire di utilizzare Formidable per evitare caricamento file anonimo.

Problemi correlati