Estoy usando el nodo v0.10.26 y express v4.2.0 y soy bastante nuevo en el nodo. He estado golpeando mi cabeza contra mi escritorio durante las últimas tres horas tratando de que un formulario de carga de archivos funcione con node. En este punto, solo estoy tratando de obtener archivos req para que no devuelvan undefined. Mi vista se ve así
<!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>
Aquí están mis rutas
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;
Y aquí está mi 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;
Vi en algún lugar que se incluía methodOverride()
y bodyParser({keepExtensions:true,uploadDir:path})
se suponía que debía ayudar, pero ni siquiera puedo iniciar mi servidor si agrego esas líneas.
node.js
file-upload
express
okawei
fuente
fuente
formidable
yexpress
. AFAIK, debe habilitar loformiable
que se encarga de tratar con datos de formularios de varias partes, guardar los archivos en el disco local (que es eluploadDir
medio) y luego puede usar algo comoreq.files
leerlos y procesar su lógica comercial.app.use(express.static(path.join(__dirname, 'public')));
Respuestas:
Problema de ExpressJS:
La mayor parte del middleware se elimina de express 4. echa un vistazo a: http://www.github.com/senchalabs/connect#middleware Para middleware multiparte como busboy, busboy-connect, formidable, flow, parted es necesario.
Este ejemplo funciona con el middleware connect-busboy . crear carpetas / img y / public.
Utilice la estructura de carpetas:
\ server.js
\ img \ "donde se cargan las cosas"
\ public \ index.html
SERVER.JS
ÍNDICE.HTML
Lo siguiente funcionará con el formidable SERVER.JS
fuente
Otra opción es usar multer , que usa ayudante de camarero debajo del capó, pero es más simple de configurar.
Utilice multer y establezca el destino para la carga:
Cree un formulario en su vista,
enctype='multipart/form-data
es necesario para que multer funcione:Luego en tu POST puedes acceder a los datos sobre el archivo:
Puede encontrar un tutorial completo sobre esto aquí .
fuente
unknown field
error. Todo en mi código es correcto. Funciona la mayor parte del tiempo y luego muestra misteriosamente esta excepción con todo lo que permanece igual (entorno, archivo, código, nombre de archivo)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);}) `` `Aquí hay una versión simplificada ( la esencia ) de la respuesta de Mick Cullen, en parte para demostrar que no tiene por qué ser muy complejo implementar esto; en parte para brindar una referencia rápida para cualquiera que no esté interesado en leer páginas y páginas de código.
Tienes que hacer que tu aplicación use connect-busboy :
Esto no hará nada hasta que lo active. Dentro de la llamada que maneja la carga, haga lo siguiente:
Analicemos esto:
req.busboy
está configurado (el middleware se cargó correctamente)"file"
oyente enreq.busboy
req
areq.busboy
Dentro del detector de archivos hay un par de cosas interesantes, pero lo que realmente importa es
fileStream
: este es un archivo legible , que luego se puede escribir en un archivo, como lo haría normalmente.Escollo: debe manejar este legible, o express nunca responderá a la solicitud , consulte la API de ayudante de camarero ( sección de archivos ).
fuente
Encuentro esto, simple y eficiente:
express-fileupload
fuente
Necesitaba que me guiaran con un poco más de detalle que las otras respuestas proporcionadas (por ejemplo, ¿cómo escribo el archivo en una ubicación que decida en tiempo de ejecución?). Con suerte, esto será de ayuda para otros:
conseguir connect-busboy:
En su server.js, agregue estas líneas
Sin embargo, esto parecería omitir el manejo de errores ... lo editaré si lo encuentro.
fuente
Multer es un middleware de node.js para manejar datos de formularios / multiparte, que se utiliza principalmente para cargar archivos. Está escrito encima del ayudante de camarero para una máxima eficiencia.
fuente
Aquí hay una forma más fácil que funcionó para mí:
fuente
Personalmente, multer no funcionó para mí después de semanas tratando de hacer bien esta carga de archivos. Luego cambio a formidable y después de unos días lo conseguí funcionando perfectamente sin ningún error, múltiples archivos, express y react.js aunque react es opcional. Aquí está la guía: https://www.youtube.com/watch?v=jtCfvuMRsxE&t=122s
fuente
Si está utilizando Node.js Express y Typecript, aquí hay un ejemplo de trabajo, esto también funciona con javascript, simplemente cambie el let a var y el import to includes, etc.
Primero importe lo siguiente, asegúrese de instalar formidable ejecutando el siguiente comando:
que importar lo siguiente:
entonces tu función como abajo:
fuente