J'essaie d'obtenir un mécanisme de téléchargement de fichiers simple fonctionnant avec Express 4.0 mais je continue à undefined
chercher req.files
dans le app.post
corps. Voici le code pertinent:
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');
});
.. et le code Pug qui l'accompagne:
form(name="uploader", action="/fileupload", method="post", enctype="multipart/form-data")
input(type="file", name="file", id="file")
input(type="submit", value="Upload")
Solution
Grâce à la réponse de mscdex ci-dessous, je suis passé à l'utilisation busboy
au lieu 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/
répertoire dans le répertoire personnel de votre application, sinon vous obtiendrez une erreur après le téléchargement.Réponses:
Le
body-parser
module ne gère que les soumissions de formulaires JSON et urlencodées, pas multiparties (ce qui serait le cas si vous téléchargez des fichiers).Pour le multipart, vous devez utiliser quelque chose comme
connect-busboy
oumulter
ouconnect-multiparty
(multiparty / formidable est ce qui était à l'origine utilisé dans le middleware express bodyParser). Aussi FWIW, je travaille sur une couche de niveau encore plus élevé au-dessus de busboy appeléreformed
. Il est livré avec un middleware Express et peut également être utilisé séparément.la source
connect-busboy
au lieu de justebusboy
. Mise à jour de mon message d'origine avec la solution.connect-multiparty
meilleure option parmi celles-ci!reformed
encore en développement? Votre dernier commit sur github date de 2014 ... Au fait, à votre avis, quel est le meilleur module pour gérer les données de formulaires en plusieurs parties? Par "meilleur", je veux dire le meilleur supporté et celui qui fonctionne mieux (moins de bugs), avec plus de fonctionnalités et avec un avenir plus long ... J'ai choisimulter
parce qu'il semblait le mieux supporté, mais je pense toujours qu'il devrait être plus supporté.Voici ce que j'ai trouvé sur Google:
Ce qui est un mécanisme assez simple pour les téléchargements
la source
fileupload
?app.js
const fileUpload = require('express-fileupload') app.use(fileUpload())
Il ressemble a
body-parser
fait support des fichiers de téléchargement des express 3, mais le soutien a été abandonné pour Express 4 quand il ne comprenait plus se connecter en tant que dépendanceAprès avoir parcouru certains des modules de la réponse de mscdex, j'ai trouvé que
express-busboy
c'était une bien meilleure alternative et la chose la plus proche d'un remplacement sans rendez-vous . Les seules différences que j'ai remarquées concernaient les propriétés du fichier téléchargé.console.log(req.files)
en utilisant l' analyseur de corps (Express 3), affichez un objet qui ressemblait à ceci:par rapport à l'
console.log(req.files)
utilisation de express-busboy (Express 4):la source
1) Assurez-vous que votre fichier est réellement envoyé du côté client. Par exemple, vous pouvez le vérifier dans Chrome Console: capture d'écran
2) Voici l'exemple de base du backend NodeJS:
la source
multer est un middleware qui gère les «multipart / form-data» et qui, comme par magie, met à disposition les fichiers téléchargés et les données de formulaire dans request sous request.files et request.body.
installer multer: -
npm install multer --save
dans le fichier .html: -
dans le fichier .js: -
J'espère que cela t'aides!
la source
Veuillez utiliser le code ci-dessous
la source
PROBLÈME RÉSOLU !!!!!!!
Il s'avère que la
storage
fonction n'a PAS fonctionné une seule fois. parce que je devais inclureapp.use(upload)
commeupload = multer({storage}).single('file');
la source
express-fileupload
ressemble au seul middleware qui fonctionne encore de nos jours.Avec le même exemple,
multer
etconnect-multiparty
donne une valeur non définie de req.file ou req.files , maisexpress-fileupload
fonctionne.Et il y a beaucoup de questions et de problèmes soulevés au sujet de la valeur vide de req.file / req.files .
la source