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.

Cómo obtener el nombre de archivo pasado en la solicitud de carga utilizando AJAX y Multer

Tienes un servidor NodeJS en el que quieres subir un archivo y estás utilizando el middleware multer mientras usas AJAX para enviar el archivo al servidor.

No quiero sobrescribir el archivo si ya existe en el servidor, así que mi plan es comprobar la existencia del archivo antes de guardarlo y lanzar un error si existe.

Este es mi código en el frontend:

<body>
  <form id="uploaddat">
    <input type="file" name="dat">
  </form>
  <form id="uploadButtonForm">
    <input type="button" value="UPLOAD" onclick="uploadFile()">
  </form>
  <script>
    uploadFile = () => {
      let fd = new FormData();
      let file = document.forms['uploaddat']['dat'].files[0];
      fd.append('file', file, "filename.dat");

  let token = window.localStorage.getItem("token");
  $.ajax({
    type: 'POST',
    url: 'url.com',
    headers: {
      'Authorization': token
    },
    data: fd,
    contentType: false,
    processData: false
  })
}
</script>
</body>

y este es el backend, utilizando multer:

var multer = require('multer');
var fs = require('fs');

var uploadedFileName = '';
var storage = multer.diskStorage({
  destination: function (req, file, cb) {
    // comprobar y crear la carpeta uploads donde se subirán los archivos
    var dirPath = './client/uploads/'
    if (!fs.existsSync(dirPath)) {
      var dir = fs.mkdirSync(dirPath);
    }
    cb(null, dirPath + '/');
  },
  filename: function (req, file, cb) {
    // el archivo estará en la variable file
    var fileName = file.originalname;
    uploadedFileName = fileName;
    cb(null, fileName);
  }
});
router.upload = function (req, res, cb) {
  console.log(req.file)
  var upload = multer({
    storage: storage
  }).array('file', 12);
  try{
    let statsObj = fs.statSync("./test.js");
    console.log("El archivo existe! Abortando");
  } catch (error) {
    console.log("Archivo no existe, subiendo...")
    upload(req, res, function (err) {
      if (err) {
        // Se produjo un error al subir
        return res.json(err);
      }
      return res.json(uploadedFileName);
    });
  }
};

Puedo subir archivos sin problemas y mantienen sus nombres originales, pero tengo dificultades para entender cómo obtener el nombre de los archivos que se están subiendo. Mi objetivo es tratar de encontrar los detalles de un archivo con el nombre de archivo cargado en el directorio (‘test.js’ es un marcador de posición) y si hay un error, subir el archivo en la condición de error (sé que probablemente no es la mejor idea, pero no puedo recordar nada más).

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para obtener el nombre del archivo que se está subiendo en el backend, se puede acceder a él a través del objeto req.file, el cual es creado por el middleware multer.

    Para verificar si el archivo ya existe en el servidor, se puede utilizar el módulo fs para verificar si el archivo con el mismo nombre ya existe en el directorio del servidor. Aquí está una versión actualizada del código del backend con comentarios:

    var multer = require('multer');
    var fs = require('fs');
    
    var storage = multer.diskStorage({
      destination: function (req, file, cb) {
        // se verifica y se crea la carpeta de subidas donde se subirán los archivos
        var dirPath = './client/uploads/';
        if (!fs.existsSync(dirPath)) {
          var dir = fs.mkdirSync(dirPath);
        }
        cb(null, dirPath);
      },
      filename: function (req, file, cb) {
        cb(null, file.originalname);
      }
    });
    
    router.upload = function (req, res, cb) {
      var upload = multer({ storage: storage }).array('file', 12);
      var fileName = req.file.originalname;
    
      // se verifica si el archivo ya existe en el directorio
      fs.stat('./client/uploads/' + fileName, function(err, stats) {
        if (err == null) {
          // el archivo existe, se devuelve un error
          res.status(409).json({ error: '¡El archivo ya existe!' });
        } else if (err.code === 'ENOENT') {
          // el archivo no existe, se sube
          upload(req, res, function (err) {
            if (err) {
              // ocurrió un error durante la subida
              return res.status(500).json({ error: err.message });
            }
            return res.json({ success: true, message: '¡Archivo subido!' });
          });
        } else {
          // ocurrió otro error
          return res.status(500).json({ error: err.message });
        }
      });
    };
    

    En este código actualizado, primero obtenemos el nombre del archivo subido del objeto req.file. Luego usamos fs.stat() para verificar si el archivo ya existe en el directorio. Si existe, devolvemos una respuesta de error con un código de estado 409 (Conflicto). Si no, procedemos con la subida usando el middleware multer. Si ocurre algún error durante el proceso de verificación o subida, devolvemos una respuesta de error con un código de estado 500 (Error interno del servidor).

Comments are closed.