req node form fileupload files expressjs data node.js express

node.js - node - save file express



Carga de archivos con Express 4.0: req.files undefined (8)

Estoy intentando obtener un simple mecanismo de carga de archivos que funcione con Express 4.0, pero sigo undefined estar undefined para req.files en el cuerpo 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 Pug 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 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''); }); }); });


1) Asegúrese de que su archivo se envíe realmente desde el lado del cliente. Por ejemplo puedes comprobarlo en la Consola Chrome: screenshot

2) Aquí está el ejemplo básico del backend de NodeJS:

const express = require(''express''); const fileUpload = require(''express-fileupload''); const app = express(); app.use(fileUpload()); // Don''t forget this line! app.post(''/upload'', function(req, res) { console.log(req.files); res.send(''UPLOADED!!!''); });


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

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


Esto es lo que encontré buscando en Google:

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

Que es un mecanismo bastante simple para subir archivos.

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 que el body-parser carga de archivos en Express 3, pero el soporte para Express 4 ya no incluía Connect como una dependencia

Después de ver algunos de los módulos en la respuesta de mscdex, descubrí que el 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) utilizando body-parser (Express 3) console.log(req.files) un objeto que se parece a esto:

{ 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) utilizando 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'' } }


Por favor use el siguiente código

app.use(fileUpload());


multer es un middleware que maneja "multipart / form-data" y mágicamente y hace que los archivos cargados y los datos de formularios estén disponibles para nosotros, como request.files y request.body.

instalación de multer: - npm install multer --save

en el archivo .html: -

<form method="post" enctype="multipart/form-data" action="/upload"> <input type="hidden" name="msgtype" value="2"/> <input type="file" name="avatar" /> <input type="submit" value="Upload" /> </form>

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!


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

Con el mismo ejemplo, multer y connect-multiparty dan un valor indefinido de req.file o req.files , pero funciona express-fileupload .

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


PROBLEMA RESUELTO !!!!!!!

Resulta que la función de storage NO se ejecutó ni una sola 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'');