Saltar al contenido

¿Cómo establecer diferentes destinos en nodejs usando multer?

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.

  1. necesitas usar DiskStorage para especificar donde & cómo del archivo almacenado.
  2. 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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *