Estou usando o node v0.10.26 e express v4.2.0 e sou muito novo no node. Eu tenho batido minha cabeça contra minha mesa nas últimas três horas tentando fazer um formulário de upload de arquivo funcionar com o node. Neste ponto, estou apenas tentando fazer com que req.files não retorne undefined. Minha visão é assim
<!DOCTYPE html>
<html>
<head>
<title>{{ title }}</title>
<link rel='stylesheet' href='/stylesheets/style.css' />
</head>
<body>
<h1>{{ title }}</h1>
<p>Welcome to {{ title }}</p>
<form method='post' action='upload' enctype="multipart/form-data">
<input type='file' name='fileUploaded'>
<input type='submit'>
</form>
</body>
</html>
Aqui estão minhas rotas
var express = require('express');
var router = express.Router();
/* GET home page. */
router.get('/', function(req, res) {
res.render('index', { title: 'Express' });
});
router.post('/upload', function(req, res){
console.log(req.files);
});
module.exports = router;
E aqui está meu app.js
var express = require('express');
var path = require('path');
var favicon = require('static-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var routes = require('./routes/index');
var users = require('./routes/users');
var app = express();
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'hjs');
app.use(favicon());
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded());
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use('/', routes);
app.use('/users', users);
/// catch 404 and forward to error handler
app.use(function(req, res, next) {
var err = new Error('Not Found');
err.status = 404;
next(err);
});
/// error handlers
// development error handler
// will print stacktrace
if (app.get('env') === 'development') {
app.use(function(err, req, res, next) {
res.status(err.status || 500);
res.render('error', {
message: err.message,
error: err
});
});
}
// production error handler
// no stacktraces leaked to user
app.use(function(err, req, res, next) {
res.status(err.status || 500);
res.render('error', {
message: err.message,
error: {}
});
});
module.exports = app;
Eu vi em algum lugar que incluir methodOverride()
e bodyParser({keepExtensions:true,uploadDir:path})
deveria ajudar, mas não consigo nem iniciar meu servidor se adicionar essas linhas.
node.js
file-upload
express
okawei
fonte
fonte
formidable
eexpress
. Você precisa habilitar o AFAIKformiable
que assume o responsável por lidar com os dados do formulário multipartes, salvar os arquivos no disco local (que é ouploadDir
meio), então você pode usar algo comoreq.files
lê-los e processar sua lógica de negócios.app.use(express.static(path.join(__dirname, 'public')));
Respostas:
Problema ExpressJS:
A maior parte do middleware é removida do express 4. confira: http://www.github.com/senchalabs/connect#middleware Para middleware multipart como busboy, busboy-connect, formidable, flow, parted é necessário.
Este exemplo funciona usando middleware connect-busboy . criar / img e / pastas públicas.
Use a estrutura de pastas:
\ server.js
\ img \ "onde as coisas são enviadas para"
\ public \ index.html
SERVER.JS
INDEX.HTML
O seguinte funcionará com o formidável SERVER.JS
fonte
Outra opção é usar multer , que usa busboy sob o capô, mas é mais simples de configurar.
Use multer e defina o destino para o upload:
Crie um formulário em sua visualização,
enctype='multipart/form-data
é necessário para que o multer funcione:Então, em seu POST, você pode acessar os dados sobre o arquivo:
Um tutorial completo sobre isso pode ser encontrado aqui .
fonte
unknown field
erro. Tudo no meu código está correto. Ele funciona na maioria das vezes, então misteriosamente mostra essa exceção com tudo permanecendo igual (ambiente, arquivo, código, nome do arquivo)app.use
`` `var upload = multer ({dest: 'uploads /'}); var app = express () app.post ('/ profile', upload.single ('field-name'), function (req, res, next) {console.log (req.file);}) `` `Aqui está uma versão simplificada ( a essência ) da resposta de Mick Cullen - em parte para provar que não precisa ser muito complexo para implementar isso; em parte, para fornecer uma referência rápida para quem não está interessado em ler páginas e páginas de código.
Você tem que fazer seu aplicativo usar connect-busboy :
Isso não fará nada até que você o acione. Na chamada que lida com o upload, faça o seguinte:
Vamos decompô-lo:
req.busboy
está definido (o middleware foi carregado corretamente)"file"
ouvinte emreq.busboy
req
parareq.busboy
Dentro do listener de arquivo, há algumas coisas interessantes, mas o que realmente importa é o
fileStream
: este é um Readable , que pode então ser gravado em um arquivo, como você normalmente faria.Armadilha: Você deve lidar com isso Legível, ou o Express nunca responderá à solicitação , consulte a API busboy ( seção de arquivos ).
fonte
Acho isso simples e eficiente:
express-fileupload
fonte
Eu precisava ser orientado com um pouco mais de detalhes do que as outras respostas fornecidas (por exemplo, como faço para gravar o arquivo em um local que decido em tempo de execução?). Espero que isso ajude outros:
get connect-busboy:
Em seu server.js, adicione estas linhas
No entanto, isso parece omitir o tratamento de erros ... vou editá-lo se eu encontrar.
fonte
Multer é um middleware node.js para lidar com multipart / form-data, que é usado principalmente para fazer upload de arquivos. É escrito no topo do busboy para máxima eficiência.
fonte
Aqui está uma maneira mais fácil que funcionou para mim:
fonte
Pessoalmente, o multer não funcionou para mim depois de semanas tentando fazer esse upload de arquivo direito. Então mudei para formidável e depois de alguns dias fiz funcionar perfeitamente sem nenhum erro, vários arquivos, express e react.js, embora o react seja opcional. Aqui está o guia: https://www.youtube.com/watch?v=jtCfvuMRsxE&t=122s
fonte
Se você estiver usando Node.js Express e Typescript, aqui está um exemplo de trabalho, isso também funciona com javascript, basta alterar let para var e importar para includes etc ...
primeiro importe o seguinte, certifique-se de instalar o formidable executando o seguinte comando:
do que importar o seguinte:
então sua função como abaixo:
fonte