Class FileStorageService

java.lang.Object
com.gestorrh.api.service.FileStorageService

@Service public class FileStorageService extends Object
Servicio encargado de la gestión de almacenamiento de archivos en el sistema de ficheros local del servidor.

Proporciona funcionalidades para la subida segura, recuperación y borrado de archivos, implementando mecanismos de defensa contra ataques de tipo Path Traversal y restricciones estrictas sobre las extensiones de archivos permitidas.

Los archivos se almacenan bajo nombres únicos generados automáticamente para evitar conflictos y garantizar la privacidad.

  • Field Details

    • fileStorageLocation

      private final Path fileStorageLocation
    • extensionesPermitidas

      private final List<String> extensionesPermitidas
  • Constructor Details

    • FileStorageService

      public FileStorageService(@Value("${file.upload-dir}") String uploadDir)
      Inicializa el servicio configurando el directorio raíz donde se almacenarán los archivos. Si el directorio no existe, intenta crearlo de forma recursiva.
      Parameters:
      uploadDir - Ruta del directorio de subida (inyectada desde la configuración de la aplicación).
      Throws:
      RuntimeException - Si el directorio no puede ser creado por falta de permisos o errores de E/S.
  • Method Details

    • guardarArchivo

      public String guardarArchivo(org.springframework.web.multipart.MultipartFile file)
      Almacena de forma física un archivo recibido mediante una petición HTTP Multipart.

      El proceso de guardado incluye:

      1. Limpieza y normalización de la ruta del archivo original.
      2. Validación contra ataques de secuencia de punto-punto (Path Traversal).
      3. Verificación de la extensión del archivo contra una lista blanca permitida.
      4. Generación de un identificador único universal (UUID) para el nombre del archivo.
      5. Copia binaria del flujo de entrada en la ubicación de almacenamiento configurada.
      Parameters:
      file - El objeto MultipartFile que contiene el flujo binario y metadatos del archivo original.
      Returns:
      String El nombre único generado (UUID + extensión) bajo el cual el archivo ha sido persistido.
      Throws:
      RuntimeException - Si el archivo es nulo, tiene una extensión no autorizada o si ocurre un error de E/S.
    • cargarArchivoComoRecurso

      public org.springframework.core.io.Resource cargarArchivoComoRecurso(String fileName)
      Recupera un archivo del almacenamiento local como un recurso cargable. Se utiliza para servir archivos (ej. justificantes o imágenes) a través de la API.
      Parameters:
      fileName - Nombre del archivo que se desea recuperar.
      Returns:
      Resource Objeto cargable que representa el contenido del archivo.
      Throws:
      RuntimeException - Si el archivo no existe o la ruta está mal formada.
    • eliminarArchivo

      public void eliminarArchivo(String fileName)
      Elimina de forma definitiva un archivo del sistema de ficheros. Se utiliza habitualmente al actualizar archivos antiguos o al borrar registros asociados.
      Parameters:
      fileName - Nombre del archivo físico que se pretende eliminar.
    • obtenerExtension

      private String obtenerExtension(String fileName)
      Utilidad privada para extraer la extensión de un nombre de archivo completo.
      Parameters:
      fileName - Nombre original del archivo (ej. "justificante.pdf").
      Returns:
      String La extensión del archivo (ej. "pdf"), o una cadena vacía si no tiene.