Eu estou tentando obter um simples upload de arquivos mecanismo de trabalho com Express 4.0, mas eu continuo recebendo undefined
para req.files
no app.post
corpo. Aqui está o 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');
});
.. e o código Pug que o acompanha:
form(name="uploader", action="/fileupload", method="post", enctype="multipart/form-data")
input(type="file", name="file", id="file")
input(type="submit", value="Upload")
Solução
Graças à resposta do mscdex abaixo, mudei para usar em busboy
vez 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/
diretório no diretório inicial do aplicativo, caso contrário, você receberá um erro após o upload.Respostas:
O
body-parser
módulo lida apenas com envios de formulários JSON e codificados por url, não com várias partes (o que seria o caso se você estiver carregando arquivos).Para multipartes, você precisa usar algo como
connect-busboy
ormulter
orconnect-multiparty
(multiparty / formidable é o que foi originalmente usado no middleware express bodyParser). Também FWIW, estou trabalhando em uma camada de nível ainda mais alto em cima do busboy chamadoreformed
. Ele vem com um middleware Express e também pode ser usado separadamente.fonte
connect-busboy
vez de apenasbusboy
. Atualizei minha postagem original com a solução.connect-multiparty
melhor opção destes!reformed
Ainda está em desenvolvimento? Seu último commit no github é de 2014 ... Aliás, na sua opinião, qual é o melhor módulo para lidar com dados de formulários de várias partes? Por "melhor", quero dizer o melhor suportado e o que funciona melhor (menos bugs), com mais recursos e com um futuro mais longo ... escolhimulter
porque parecia o melhor suportado, mas ainda acho que deveria ser mais suportado.Aqui está o que eu encontrei pesquisando:
O que é um mecanismo bastante simples para uploads
fonte
fileupload
?app.js
const fileUpload = require('express-fileupload') app.use(fileUpload())
Parece
body-parser
que suportou o upload de arquivos no Express 3, mas o suporte foi descartado para o Express 4 quando não incluiu mais o Connect como uma dependênciaDepois de examinar alguns dos módulos na resposta do mscdex, descobri que
express-busboy
era uma alternativa muito melhor e a coisa mais próxima de uma substituição imediata . As únicas diferenças que notei foram nas propriedades do arquivo carregado.console.log(req.files)
usando body-parser (Express 3) produz um objeto parecido com isto:comparado ao
console.log(req.files)
uso do express-busboy (Express 4):fonte
1) Verifique se o seu arquivo é realmente enviado do lado do cliente. Por exemplo, você pode verificá-lo no Chrome Console: captura de tela
2) Aqui está o exemplo básico do back-end do NodeJS:
fonte
O multer é um middleware que lida com “multipart / form-data” e magicamente e disponibiliza os arquivos e dados do formulário enviados a nós, a pedido, como request.files e request.body.
instalação multer: -
npm install multer --save
no arquivo .html: -
no arquivo .js: -
Espero que isto ajude!
fonte
Por favor, use o código abaixo
fonte
PROBLEMA RESOLVIDO !!!!!!!
Acontece que a
storage
função NÃO executou nem uma vez. porque eu tive que incluirapp.use(upload)
comoupload = multer({storage}).single('file');
fonte
express-fileupload
parece o único middleware que ainda funciona atualmente.Com o mesmo exemplo,
multer
econnect-multiparty
fornece um valor indefinido de req.file ou req.files , masexpress-fileupload
funciona.E há muitas perguntas e questões levantadas sobre o valor vazio de req.file / req.files .
fonte