¿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 “
“, 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?
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 objetoResponseEntity
y proporcionar un nombre de archivo personalizado en los encabezados de la respuesta. Aquí tienes un ejemplo:En este código, creamos un objeto
HttpHeaders
y establecemos el tipo de contenido comoMediaType.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étodosetContentDispositionFormData()
. Finalmente, devolvemos un objetoResponseEntity
que contiene los bytes de la imagen, los encabezados y unHttpStatus
deOK
(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[]>