Curso de Spring Boot

Muchas aplicaciones necesitan trabajar con archivos.

Por ejemplo:

  • subir imágenes
  • subir documentos
  • descargar archivos
  • almacenar archivos en el servidor

Spring Boot facilita mucho este proceso.

En este capítulo veremos:

  • subir archivos
  • guardar archivos
  • descargar archivos
  • buenas prácticas

15.1 Subir archivos (Upload)

Para subir archivos usamos:

1MultipartFile

Este objeto representa un archivo enviado desde el cliente.


15.2 Ejemplo HTML para subir archivo

1<form method="post" enctype="multipart/form-data" action="/upload">
2
3    <input type="file" name="file">
4    <button type="submit">Subir</button>
5
6</form>

El atributo importante es:

1enctype="multipart/form-data"

15.3 Controller para subir archivo

1@RestController
2public class FileController {
3
4    @PostMapping("/upload")
5    public String uploadFile(@RequestParam("file") MultipartFile file) {
6
7        return "Archivo recibido: " + file.getOriginalFilename();
8
9    }
10
11}

15.4 Información disponible en MultipartFile

Podemos obtener:

métodofunción
getOriginalFilename()nombre archivo
getSize()tamaño
getContentType()tipo MIME
getBytes()contenido

15.5 Guardar archivo en el servidor

Normalmente guardamos el archivo en el sistema de archivos.


Ejemplo

1@PostMapping("/upload")
2public String uploadFile(@RequestParam MultipartFile file) throws IOException {
3
4    Path path = Paths.get("uploads/" + file.getOriginalFilename());
5
6    Files.write(path, file.getBytes());
7
8    return "Archivo guardado";
9
10}

Esto guardará el archivo en la carpeta:

1uploads

15.6 Crear carpeta automáticamente

Podemos comprobar si la carpeta existe.

1Path uploadDir = Paths.get("uploads");
2
3if(!Files.exists(uploadDir)) {
4    Files.createDirectories(uploadDir);
5}

15.7 Descargar archivos

Para descargar archivos usamos ResponseEntity.


Ejemplo

1@GetMapping("/download/{filename}")
2public ResponseEntity<Resource> downloadFile(
3        @PathVariable String filename) throws IOException {
4
5    Path path = Paths.get("uploads/" + filename);
6
7    Resource resource = new UrlResource(path.toUri());
8
9    return ResponseEntity.ok()
10            .header(HttpHeaders.CONTENT_DISPOSITION,
11                    "attachment; filename=\"" + filename + "\"")
12            .body(resource);
13
14}

15.8 Descargar archivos desde navegador

Si visitamos:

1http://localhost:8080/download/documento.pdf

El navegador descargará el archivo.


15.9 Validar archivos subidos

Siempre debemos validar los archivos.

Por ejemplo:

  • tamaño máximo
  • tipo de archivo
  • nombre del archivo

Ejemplo validar tamaño

1if(file.getSize() > 5_000_000) {
2    throw new RuntimeException("Archivo demasiado grande");
3}

Validar tipo

1if(!file.getContentType().equals("image/png")) {
2    throw new RuntimeException("Solo PNG permitido");
3}

15.10 Configurar tamaño máximo

En application.properties.

1spring.servlet.multipart.max-file-size=10MB
2spring.servlet.multipart.max-request-size=10MB

15.11 Guardar archivos con nombre único

Para evitar conflictos se puede generar un nombre único.


Ejemplo

1String filename = UUID.randomUUID() + "_" + file.getOriginalFilename();

Esto genera algo como:

13f2e91a2-foto.png

15.12 Guardar archivos en base de datos

También podemos guardar archivos en la base de datos.


Ejemplo entidad

1@Entity
2public class Document {
3
4    @Id
5    @GeneratedValue
6    private Long id;
7
8    private String name;
9
10    @Lob
11    private byte[] data;
12
13}

Guardar archivo

1Document doc = new Document();
2
3doc.setName(file.getOriginalFilename());
4doc.setData(file.getBytes());
5
6repository.save(doc);

15.13 Almacenamiento externo

En aplicaciones grandes se usan servicios externos.

Ejemplos:

  • Amazon S3
  • Google Cloud Storage
  • Azure Blob Storage
  • Cloudinary

Esto evita cargar el servidor.


15.14 Buenas prácticas

Validar archivos

Nunca aceptar cualquier archivo.


Limitar tamaño

Evita ataques de subida masiva.


Usar nombres únicos

Evita sobrescribir archivos.


No guardar archivos en carpetas públicas

Evita accesos no autorizados.


15.15 Ejemplo completo

1@RestController
2@RequestMapping("/files")
3public class FileController {
4
5    private final Path uploadDir = Paths.get("uploads");
6
7    @PostMapping("/upload")
8    public String upload(@RequestParam MultipartFile file) throws IOException {
9
10        if(!Files.exists(uploadDir)) {
11            Files.createDirectories(uploadDir);
12        }
13
14        String filename = UUID.randomUUID() + "_" + file.getOriginalFilename();
15
16        Path path = uploadDir.resolve(filename);
17
18        Files.write(path, file.getBytes());
19
20        return "Archivo guardado: " + filename;
21
22    }
23
24}
  • Loading...