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).
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:En este código actualizado, primero obtenemos el nombre del archivo subido del objeto
req.file
. Luego usamosfs.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).