2012-04-12 5 views
7

Hochladen von Dateien mit node-formidable auf Express ist so einfach wie dieseSachen mit mehreren Dateien tun, wenn sie unter Verwendung von Knoten-formidable mit Express

app.post('/upload', function(req, res) { 
    // do something with req.files 
}); 

Die Dateien jetzt

Die Form gespeichert hochladen: (multiple = "multiple" ist ein HTML5-Funktion, die es Benutzern, mehrere Dateien hochladen)

<form method="post" enctype="multipart/form-data" action="upload"> 
    <input type="text" name="title"/> 
    <input type="file" name="upload" multiple="multiple"/> 
    <input type="submit" value="upload" id="s3form_submit"/> 
</form> 

auswählen können, wenn ich diese Zeile, um den Code-Upload hinzufügen

console.log(req.files.upload.path); 

Beim Hochladen einer Datei wird der Pfad in der Konsole angezeigt. Aber wenn ich mehr als eine Datei hochlade, heißt es nur undefined in der Konsole. Wie erhalte ich das Log-Zeug für jede Datei? Verwenden einer For-Schleife?

Der Knoten-formidable Beispiel auf GitHub protokolliert jede Datei, wenn Sie mehrere Upload: https://github.com/felixge/node-formidable/blob/master/example/upload.js (Ich habe versucht, diesen Code in Express verwendet wird, hat nicht funktioniert) Es genau das tut, was ich will, aber wie mache ich das in ein Express-App?

Antwort

8

Es funktioniert durch Verschieben der Zeile unten an der Unterseite der app.configure-Funktion. Lesen Sie die Bedeutung der Ordnung in Bezug auf Middleware in Express über hier: http://expressjs.com/guide.html#middleware

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

Und mit Hilfe dieser Handler:

app.post('/upload', function(req, res){ 
    var form = new formidable.IncomingForm(), 
    files = [], 
    fields = []; 
    form.on('field', function(field, value) { 
     fields.push([field, value]); 
    }) 
    form.on('file', function(field, file) { 
     console.log(file.name); 
     files.push([field, file]); 
    }) 
    form.on('end', function() { 
     console.log('done'); 
     res.redirect('/forms'); 
    }); 
    form.parse(req); 
}); 

Dank Ryan!

1

So req.files könnte ein Array sein. Versuchen Sie es mit console.log(req.files) im Handler und sehen Sie, wie es aussieht ... Aber ich denke, es geht Ihnen besser, wenn Sie es wie in ihrem Beispiel tun. Sie können es zum Laufen bringen, indem Sie einfach die ../test/common Anforderung oben entfernen und die Konstanten in statische Werte ändern (z. B. statt TEST_TMP__dirname + '/uploads' verwenden).

Der Handler:

var form = new formidable.IncomingForm(), 
    files = [], 
    fields = []; 

form.uploadDir = __dirname + '/uploads'; 

form 
    .on('field', function(field, value) { 
    console.log(field, value); 
    fields.push([field, value]); 
    }) 
    .on('file', function(field, file) { 
    console.log(field, file); 
    files.push([field, file]); 
    }) 
    .on('end', function() { 
    console.log('-> upload done'); 
    res.writeHead(200, {'content-type': 'text/plain'}); 
    res.write('received fields:\n\n '+util.inspect(fields)); 
    res.write('\n\n'); 
    res.end('received files:\n\n '+util.inspect(files)); 
    }); 
form.parse(req); 

Die Dateien sind nun in __dirname + '/uploads' benannt nach der Ausgabe auf der Konsole (und auf die Antwort, wie Sie in den end Handler sehen).

Verwandte Themen