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.

¿Puede Spring Boot establecer el nombre de un archivo que se descarga desde un punto final del controlador?

Java 11 y Spring Boot 2.5.x aquí. Entiendo que puedo configurar un controlador para devolver el contenido de un archivo de la siguiente manera:

@GetMapping(
  value = "/get-image-with-media-type",
  produces = MediaType.IMAGE_JPEG_VALUE
)
public @ResponseBody byte[] getImageWithMediaType() throws IOException {
    InputStream in = getClass()
      .getResourceAsStream("/path/to/some/image.jpg");
    return IOUtils.toByteArray(in);
}

Pero, ¿qué pasa si quiero controlar el nombre del archivo que se envía de vuelta? Por ejemplo, en el lado del servidor, el nombre del archivo se podría almacenar como “image.jpg“, pero digamos que quiero que se devuelva como “--image.jpg“, donde “” es el ID del usuario autenticado que realiza la solicitud, y donde “” es la fecha en la que se realiza la solicitud.

Por ejemplo, si el usuario 123 realiza la solicitud el 10/12/2021, el archivo se descargaría como “123-2021-12-10-image.jpg“, y si el usuario 234 realiza la solicitud el 17/01/2022, se descargaría como “234-2022-01-17-image.jpg“. ¿Es posible controlar esto en el lado del servidor con Spring/Java, o depende del cliente HTTP (navegador, PostMan, cualquier cosa) decidir el nombre del archivo?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para controlar el nombre de archivo que se envía de vuelta en la respuesta, podemos modificar el método getImageWithMediaType() para devolver un objeto ResponseEntity y proporcionar un nombre de archivo personalizado en los encabezados de la respuesta. Aquí tienes un ejemplo:

    @GetMapping(
      value = "/get-image-with-media-type",
      produces = MediaType.IMAGE_JPEG_VALUE
    )
    public ResponseEntity<byte[]> getImageWithMediaType() throws IOException {
        InputStream in = getClass()
          .getResourceAsStream("/ruta/a/algun/imagen.jpg");
        byte[] imageBytes = IOUtils.toByteArray(in);
    
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.IMAGE_JPEG);
    
        // Supongamos que el userId y el requestDate ya están calculados
        String filename = userId + "-" + requestDate + "-imagen.jpg";
    
        headers.setContentDispositionFormData(filename, filename);
    
        return new ResponseEntity<>(imageBytes, headers, HttpStatus.OK);
    }
    

    En este código, creamos un objeto HttpHeaders y establecemos el tipo de contenido como MediaType.IMAGE_JPEG. También calculamos el nombre de archivo personalizado utilizando el ID de usuario y la fecha de solicitud. Luego, establecemos el encabezado de disposición de contenido para incluir el nombre de archivo personalizado utilizando el método setContentDispositionFormData(). Finalmente, devolvemos un objeto ResponseEntity que contiene los bytes de la imagen, los encabezados y un HttpStatus de OK (200).

    Con esta modificación, el cliente HTTP debería recibir el nombre de archivo personalizado como parte de los encabezados de respuesta y debería ofrecer al usuario la opción de guardar el archivo con ese nombre.</byte[]>

Comments are closed.