Estoy tratando de obtener un mecanismo simple de carga de archivos que funcione con Express 4.0, pero sigo undefined
buscando req.files
en el app.post
cuerpo. 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 a continuación, he cambiado a usar en 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');
});
});
});
./files/
directorio en el directorio de inicio de su aplicación; de lo contrario, recibirá un error después de cargarlo.Respuestas:
El
body-parser
módulo solo maneja envíos de formularios JSON y urlencoded, no multiparte (que sería el caso si está cargando archivos).Para multiparte, necesitaría usar algo como
connect-busboy
omulter
oconnect-multiparty
(multiparte / 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 llamadoreformed
. Viene con un middleware Express y también se puede usar por separado.fuente
connect-busboy
lugar de solobusboy
. Actualicé mi publicación original con la solución.connect-multiparty
mejor opción de estas!reformed
Todavía está en desarrollo? Su último commit en github es de 2014 ... Por cierto, en su opinión, ¿cuál es el mejor módulo para manejar datos de formularios multiparte? Por "mejor" me refiero al mejor compatible y al que funciona mejor (menos errores), con más funciones y con un futuro más largo ... Elegímulter
porque parecía el mejor compatible, pero todavía creo que debería ser más compatible.Esto es lo que encontré buscando en Google:
Que es un mecanismo bastante simple para cargas
fuente
fileupload
?app.js
const fileUpload = require('express-fileupload') app.use(fileUpload())
Parece
body-parser
que admitía cargar archivos en Express 3, pero se eliminó el soporte para Express 4 cuando ya no incluía Connect como una dependenciaDespués de revisar algunos de los módulos en la respuesta de mscdex, descubrí que
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) genera un objeto que se ve así:en comparación con el
console.log(req.files)
uso de express-busboy (Express 4):fuente
1) Asegúrese de que su archivo se envíe realmente desde el lado del cliente. Por ejemplo, puede verificarlo en Chrome Console: captura de pantalla
2) Aquí está el ejemplo básico del backend NodeJS:
fuente
multer es un middleware que maneja "datos multiparte / formulario" y mágicamente hace que los archivos cargados y los datos del formulario estén disponibles para nosotros como request.files y request.body.
instalación de multer: -
npm install multer --save
en archivo .html: -
en archivo .js: -
¡Espero que esto ayude!
fuente
Por favor use el siguiente código
fuente
PROBLEMA RESUELTO !!!!!!!
Resulta que la
storage
función NO se ejecutó ni una sola vez. porque tuve que incluirapp.use(upload)
comoupload = multer({storage}).single('file');
fuente
express-fileupload
parece el único middleware que aún funciona en estos días.Con el mismo ejemplo,
multer
yconnect-multiparty
da un valor indefinido de req.file o req.files , peroexpress-fileupload
funciona.Y hay muchas preguntas y cuestiones planteadas sobre el valor vacío de req.file / req.files .
fuente