J'ai examiné de nombreuses réponses à cette question, mais je n'ai pas encore trouvé de solution efficace. J'essaie de créer une application Web sur laquelle vous pouvez télécharger des fichiers en utilisant express et multer, et je rencontre un problème: aucun fichier n'est chargé et req.file est toujours indéfini.
Mon code ci-dessous
'use strict';
var express = require('express');
var path = require('path');
var multer = require('multer')
var upload = multer({ dest: 'uploads/' })
var app = express();
require('dotenv').load();
app.use(express.static(path.join(__dirname, 'main')));
app.post('/upload', upload.single('upl'), function (req, res, next) {
// req.file is the `avatar` file
// req.body will hold the text fields, if there were any
console.log(req.file);
res.status(204).end();
})
var port = process.env.PORT || 8080;
app.listen(port, function () {
console.log('Node.js listening on port ' + port + '...');
});
La forme
<form class="uploadForm" action="/upload" method="post" enctype="multipart/formdata">
<label class="control-label">Select File</label>
<input name="upl" id="input-1" type="file" class="file">
<input type="submit" value="submit" />
</form>
Aide très appréciée, cela me rend folle.
Votre enctype
est légèrement incorrect, il devrait être multipart/form-data
au lieu de multipart/formdata
.
En cas de facteur, essayez de suivre:
Cela peut résoudre le problème. Chaque fois que vous redémarrez le serveur, vous devez suivre les étapes ci-dessus pour rappeler l'API. La raison en est que multer renvoie au client des cookies appelés connect.sid dont il pourrait avoir besoin lors de communications ultérieures. L'utilisation d'anciens cookies ne téléchargera pas le fichier.
Oui, votre enctype
est fausse et c'est le seul problème. Assurez-vous de corriger votre enctype, sinon vous risquez de ne pas être défini dans req.file ou req.files.
Je mets MA (il y en a beaucoup j'imagine et sûrement mieux) une solution pour aider beaucoup de gens comme moi car j'ai cherché pendant une journée entière ;-(
//JS file on node side
var express = require('express');
var fileUpload = require('express-fileupload');
var fs = require("fs");
var app = express();
console.log('étape 0');
app.use(express.static('mesStatic'));
app.use(fileUpload());
console.log('étape 1');
app.get('/indexFileUpload.htm', function (req, res) {
res.sendFile( __dirname + "/" + "indexFileUpload.htm" );
})
console.log('étape 2');
app.post('/file_upload', function (req, res) {
console.log('étape 3');
console.log('req.files:' , req.files);
if (!req.files) {
res.send('No files to upload.');
return;
}
console.log('req.files.file.data:' , req.files.file.data);
var bufDataFile = new Buffer(req.files.file.data, "utf-8");
console.log('étape 3.1');
console.log('__dirname : ' + __dirname);
fs.writeFile(__dirname + '/file_upload/output.txt', bufDataFile, function(err) {
if (err) {
return console.error(err);
}
else {
console.log("Data written successfully !");
}
console.log('étape 4');
res.end('Fin OK !!!');
})
})
var server = app.listen(8081, function () {
var Host = server.address().address
var port = server.address().port
console.log("Example app listening at http://%s:%s", Host, port);
})
Pour nous, c'était parce que nous utilisions express-http-proxy
pour proxyer l'appel avant multer, et nous devions utiliser l'option parseReqBody: false
pour envoyer correctement le fichier.
c'est à dire.
app.post('file/upload', proxy(process.env.API_URL, {
parseReqBody: false,
}))
Fichier HTML,
<form class="uploadForm" action="/upload" method="post" enctype="multipart/form-data">
<label class="control-label">Select File</label>
<input name="upl" id="input-1" type="file" class="file">
<input type="submit" value="submit" />
</form>
app.js
var express=require("express");
var multer=require("multer");
var app=express();
var upload=multer({dest:"uploads/"});
app.post("/upload",upload.single("upl"),function(req,res){
console.log("Uploaded Successfull with filename : "+req.upl.filename);
});