Tenemos la mejor información que hallamos en todo internet. Queremos que te sea de mucha utilidad y si puedes comentarnos alguna mejora hazlo con libertad.
Solución:
Actualizar
Algunas cosas han cambiado desde que publiqué la respuesta original.
Con multer 1.2.1
.
- necesitas usar
DiskStorage
para especificar donde & cómo del archivo almacenado. - De forma predeterminada, multer utilizará el directorio predeterminado del sistema operativo. En nuestro caso, ya que somos exigentes con la ubicación. Necesitamos asegurarnos de que la carpeta existe antes de poder guardar el archivo allí.
Nota: Usted es responsable de crear el directorio al proporcionar el destino como una función.
Más aquí
'use strict';
let multer = require('multer');
let fs = require('fs-extra');
let upload = multer(
storage: multer.diskStorage(
destination: (req, file, callback) =>
let type = req.params.type;
let path = `./uploads/$type`;
fs.mkdirsSync(path);
callback(null, path);
,
filename: (req, file, callback) =>
//originalname is the uploaded file's name with extn
callback(null, file.originalname);
)
);
app.post('/api/:type', upload.single('file'), (req, res) =>
res.status(200).send();
);
fs-extra
para crear directorio, por si acaso si no existe
respuesta original
Puede utilizar cambiarDest.
Función para cambiar el nombre del directorio en el que colocar los archivos cargados.
Está disponible desde v0.1.8
app.post('/api/:type', multer(
dest: './uploads/',
changeDest: function(dest, req, res)
var newDestination = dest + req.params.type;
var stat = null;
try
stat = fs.statSync(newDestination);
catch (err)
fs.mkdirSync(newDestination);
if (stat && !stat.isDirectory())
throw new Error('Directory cannot be created because an inode of a different type exists at "' + dest + '"');
return newDestination
), function(req, res)
//set your response
);
Multer es un middleware, por lo que puede pasarlo así:
app.post('/test/route', multer(...options...), module.someThing)
o
app.post('/test/route', multer(...options...), function(req, res)
........some code ......
);
Puedes hacer una función así:
var uploadFnct = function(dest)
var storage = multer.diskStorage( //multers disk storage settings
destination: function (req, file, cb)
cb(null, './public/img/'+dest+'/');
,
filename: function (req, file, cb)
var datetimestamp = Date.now();
cb(null, file.fieldname + '-' + datetimestamp + '.' + file.originalname.split('.')[file.originalname.split('.').length -1]);
);
var upload = multer( //multer settings
storage: storage
).single('file');
return upload;
;
Y luego úsalo en tu ruta de carga:
//Handle the library upload
app.post('/app/library/upload', isAuthenticated, function (req, res)
var currUpload = uploadFnct('library');
currUpload(req,res,function(err)
if(err)
res.json(error_code:1,err_desc:err);
return;
res.json(error_code:0,err_desc:null, filename: req.file.filename);
);
);
Si conservas alguna incertidumbre o capacidad de afinar nuestro enunciado puedes realizar una anotación y con deseo lo ojearemos.