Carga de archivos con Express 4.0: archivos req. No definidos

Estoy intentando obtener un mecanismo simple de carga de archivos que funcione con Express 4.0, pero sigo undefined req.files para los req.files en el cuerpo de app.post . Aquí está el código relevante:

 var bodyParser = require('body-parser'); var methodOverride = require('method-override'); //... app.use(bodyParser({ uploadDir: path.join(__dirname, 'files'), keepExtensions: true })); app.use(methodOverride()); //... app.post('/fileupload', function (req, res) { console.log(req.files); res.send('ok'); }); 

.. y el código de Jade que lo acompaña:

 form(name="uploader", action="/fileupload", method="post", enctype="multipart/form-data") input(type="file", name="file", id="file") input(type="submit", value="Upload") 

Solución
Gracias a la respuesta de mscdex a continuación, he cambiado a usar busboy lugar de bodyParser :

 var fs = require('fs'); var busboy = require('connect-busboy'); //... app.use(busboy()); //... app.post('/fileupload', function(req, res) { var fstream; req.pipe(req.busboy); req.busboy.on('file', function (fieldname, file, filename) { console.log("Uploading: " + filename); fstream = fs.createWriteStream(__dirname + '/files/' + filename); file.pipe(fstream); fstream.on('close', function () { res.redirect('back'); }); }); }); 

El módulo body-parser solo maneja los envíos de formularios JSON y urlencoded, no multiparte (que sería el caso si está cargando archivos).

Para varias partes, necesitarías usar algo como connect-busboy o multer o connect-multiparty (multiparty / formidable es lo que originalmente se usó en el middleware express bodyParser). También FWIW, estoy trabajando en una capa de nivel aún más alto sobre busboy llamado reformed . Viene con un middleware Express y también se puede usar por separado.

Esto es lo que encontré en Google:

 var fileupload = require("express-fileupload"); 

Que es un mecanismo bastante simple para cargas

 app.post("/upload", function(req, res) { var file; if(!req.files) { res.send("File was not found"); return; } file = req.files.FormFieldName; // here is the field name of the form file.mv("file.txt", function(err) //Obvious Move function { // log your error }); res.send("File Uploaded"); }); 

Parece body-parser carga de archivos en Express 3, pero se eliminó el soporte para Express 4 cuando ya no se incluía Connect como dependencia

Después de revisar algunos de los módulos en la respuesta de mscdex, descubrí que el bus express-busboy era una alternativa mucho mejor y lo más parecido a un reemplazo directo. Las únicas diferencias que noté estaban en las propiedades del archivo cargado.

console.log(req.files) usando body-parser (Express 3) console.log(req.files) un objeto que se veía así:

 { file: { fieldName: 'file', originalFilename: '360px-Cute_Monkey_cropped.jpg', name: '360px-Cute_Monkey_cropped.jpg' path: 'uploads/6323-16v7rc.jpg', type: 'image/jpeg', headers: { 'content-disposition': 'form-data; name="file"; filename="360px-Cute_Monkey_cropped.jpg"', 'content-type': 'image/jpeg' }, ws: WriteStream { /* ... */ }, size: 48614 } } 

comparado con console.log(req.files) usando express-busboy (Express 4):

 { file: { field: 'file', filename: '360px-Cute_Monkey_cropped.jpg', file: 'uploads/9749a8b6-f9cc-40a9-86f1-337a46e16e44/file/360px-Cute_Monkey_cropped.jpg', mimetype: 'image/jpeg', encoding: '7bit', truncated: false uuid: '9749a8b6-f9cc-40a9-86f1-337a46e16e44' } } 

multer es un middleware que maneja “multipart / form-data” y mágicamente y hace que los archivos cargados y los datos disponibles para nosotros sean solicitados como request.files y request.body.

instalando multer: – npm install multer --save

en el archivo .html: –

 

en el archivo .js: –

 var express = require('express'); var multer = require('multer'); var app = express(); var server = require('http').createServer(app); var port = process.env.PORT || 3000; var upload = multer({ dest: 'uploads/' }); app.use(function (req, res, next) { console.log(req.files); // JSON Object next(); }); server.listen(port, function () { console.log('Server successfully running at:-', port); }); app.get('/', function(req, res) { res.sendFile(__dirname + '/public/file-upload.html'); }) app.post('/upload', upload.single('avatar'), function(req, res) { console.log(req.files); // JSON Object }); 

¡Espero que esto ayude!

PROBLEMA RESUELTO !!!!!!!

Resulta que la función de storage NO SE ejecutó ni una vez. porque tuve que incluir app.use(upload) como upload = multer({storage}).single('file');

  let storage = multer.diskStorage({ destination: function (req, file, cb) { cb(null, './storage') }, filename: function (req, file, cb) { console.log(file) // this didn't print anything out so i assumed it was never excuted cb(null, file.fieldname + '-' + Date.now()) } }); const upload = multer({storage}).single('file'); 

express-fileupload parece el único middleware que todavía funciona en estos días.

Con el mismo ejemplo, multer y connect-multiparty dan un valor indefinido de archivo de solicitud o archivos de búsqueda , pero la carga de archivos express-fileupload funciona.

Y hay muchas preguntas y problemas planteados sobre el valor vacío de los archivos req.file / req.files .