es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Express.js – El filtro de archivos de Multer no está funcionando.

Quiero filtrar los archivos mientras los cargo en el servidor, pero el método fileFilter de Multer no está funcionando.

Backend

Los métodos destination y filename están funcionando correctamente, pero fileFilter no está funcionando.

const storage = multer.diskStorage({
  destination: function (req, file, cb) {
    cb(null, "./public/images/");
  },
  filename: function (req, file, cb) {
    cb(null, file.fieldname + path.extname(file.originalname));
  },
  fileFilter: function (req, file, callback) {
    console.log("Hola Mundo"); // Esto tampoco funciona

    var ext = path.extname(file.originalname);
    if (![".jpg", ".jpeg"].includes(ext)) {
      return callback(new Error('Solo se permiten imágenes'));
    }

    callback(null, true);
  },
});

app.use(
  multer({ storage: storage }).fields([
    { name: "logo", maxCount: 1 },
    { name: "favicon", maxCount: 1 },
  ])
);

Frontend

Logo
Favicon
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que el método fileFilter no está siendo llamado en absoluto. Esto podría deberse al hecho de que no es un método compatible con diskStorage. En lugar de diskStorage, puedes usar memoryStorage con un método fileFilter. Aquí tienes una definición de storage actualizada que debería funcionar:

    const storage = multer.memoryStorage({
      destination: function (req, file, cb) {
        cb(null, "");
      },
      fileFilter: function (req, file, callback) {
        var ext = path.extname(file.originalname);
        if (![".jpg", ".jpeg"].includes(ext)) {
          return callback(
            new Error("Solo se permiten imágenes con extensiones .jpg y .jpeg")
          );
        }
    
        callback(null, true);
      },
    });
    

    Ten en cuenta que memoryStorage no tiene un método destination, por lo que simplemente podemos pasar una cadena vacía para usar el destino predeterminado. Además, el mensaje de error en el método fileFilter se ha actualizado para proporcionar información más específica sobre qué extensiones de archivo están permitidas.

    ¡Espero que esto ayude!

Comments are closed.