node.js - form - nodejs multer file upload example
No se puede aplicar.use(multer). Error "requiere funciĆ³n de middleware" (7)
Cambiar a app.use (multer ({dest: ''./ uploads /''}). Single (''foto'')); en la aplicación.js funciona para que pueda iniciar el servidor
Estoy empezando a aprender NodeJS y tengo un problema. Me gustaría subir archivos a mi servidor. Para hacerlo, busqué y descubrí este módulo multer . Haciendo como el ejemplo en GitHub funciona:
var express = require(''express'');
var multer = require(''multer'');
var upload = multer({ dest: ''uploads/'' });
var app = express()
app.post(''/uploadImage'', upload.single(''image''), function(req, res) {
console.log(req.file);
});
Al publicar una imagen con FormData en /uploadImage
la imagen se guarda en el directorio /uploadImage
uploads/
. Lo que pasa es que la imagen se guarda con un nombre extraño y me gustaría guardarla con su nombre original. Para hacerlo, comprendí que tendría que llamar a app.use(multer({ dest: ''uploads/'' }))''
y luego podría acceder a req.file
en mi función como:
app.post(''/uploadImage'', function(req, res) {
console.log(req.file);
});
Pero me aparece un error al probar app.use ():
TypeError: app.use() requires middleware functions
at EventEmitter.use (project/node_modules/express/lib/application
.js:209:11)
Estoy usando NodeJS 0.12.7 y Express 4.13.1
¿Cómo puedo lograr esa carga? Gracias.
Debes usar app.use(multer({dest:''./uploads/''}))
en la forma de uno de estos:
app.use(multer({dest:''./uploads/''}).single(...));
app.use(multer({dest:''./uploads/''}).array(...));
app.use(multer({dest:''./uploads/''}).fields(...));
es decir:
app.use(multer({dest:''./uploads/''}).single(''photo''));
Y asegúrese de tener algo como:
<form action="/postPhotos" enctype="multipart/form-data" method="post">
<input type="file" name="photo">
<input type="submit" value="Upload photo">
</form>
En tu html
Desde la versión 1.0.0
var upload = multer({ dest: ''tmp/'' });
app.post(''/file_upload'', upload.single(''photo''), function (req, res) {
La respuesta de @ 127.0.0.1 es correcta, pero en caso de que esté utilizando Express Router , el código cambia un poco:
var express = require(''express'');
var multer = require(''multer'');
var router = express.Router();
var uploads = multer({
dest: ''public/uploads/''
});
router.post(''/upload'', uploads.single(''avatar''), function(req, res, next) {
console.log(req.file);
//...
});
Y lo importante, la codificación del formulario debe ser enctype="multipart/form-data"
como ya se dijo, así:
<form action="/upload" enctype="multipart/form-data" method="post">
<input type="file" name="avatar">
<input type="submit" value="Go avatar go!">
</form>
Me encontré con el mismo problema. Y lo solucioné Para el primer problema, ¿cómo obtener el nombre del archivo original? Imprimí la solicitud completa y encontré que podíamos obtener el nombre original utilizando la ruta "req.file.originalname"
y la otra pregunta, ¿cómo usar "app.use ()"?
se refiere: here
No puede cambiar el nombre de archivo usando multer pero puede usar el flujo de Node.js y el módulo fs para copiar el contenido del archivo ya cargado en un archivo nuevo (establecer como nombre de archivo original) en la misma carpeta y eliminar el anterior.
En primer lugar, importa fs, path y multer en tu script de nodo.
var express = require(''express'');
var multer = require(''multer'');
var fs = require(''fs'');
var pathModule = require(''path'');
Ahora, configure el directorio de destino de cualquier tipo de archivos usando multer como se muestra a continuación.
var app = express();
app.use(multer({dest:__dirname+''/resoucres/''}).any());
Ahora usa stream y fs para resolver tu problema.
app.post(''/uploadImage'', function(request, response) {
var readerStream = fs.createReadStream(request.files[0].path);
var dest_file = pathModule.join(request.files[0].destination, request.files[0].originalname);
var writerStream = fs.createWriteStream(dest_file);
var stream = readerStream.pipe(writerStream);
stream.on(''finish'', function(){
fs.unlink(request.files[0].path);
});
});
var app = require(''express'');
var multer = require(''multer'');
app=express();
app.use(multer({dest:__dirname+''/file/uploads/''}).any());
app.post(''/upload'',function(req,res){
console.log(req.files);
res.redirect(''/'');
});