Бывают ситуации, когда нам нужно вернуть загружаемый файл из метода контроллера, например, нам может потребоваться вернуть динамический pdf-файл, сгенерированный из записей базы данных, или какой-либо csv-файл, содержащий записи, или какое-либо обработанное изображение и т.д.
Чтобы вернуть файл из контроллера spring, вам просто нужно вернуть байты с соответствующими заголовками. В этой статье будет объяснено, как загрузить файл из метода spring controller.
Допустим, у вас есть GET /demo-file-download
конечная точка и мы хотим вернуть demo-file.txt
с динамически создаваемым контентом. Наш метод контроллера будет выглядеть следующим образом:
@GetMapping(value = "/demo-file-download") public ResponseEntitydemo() { // (1) Return byte array response String demoContent = "This is dynamically generated content in demo file"; // (2) Dynamic content ... }
- (1) Мы возвращаем ответ массива байтов в ответ на
GET/demo-file-download
. - (2) Это фиктивный динамический контент, это могут быть записи из базы данных или некоторые вычисленные данные.
Нам нужно установить соответствующие заголовки, чтобы браузер мог правильно обрабатывать ответ:
@GetMapping(value = "/demo-file-download") public ResponseEntitydemo() { // (1) Return byte array response String demoContent = "This is dynamically generated content in demo file"; // (2) Dynamic content HttpHeaders httpHeaders = new HttpHeaders(); httpHeaders.set(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_OCTET_STREAM_VALUE); // (3) Content-Type: application/octet-stream httpHeaders.set(HttpHeaders.CONTENT_DISPOSITION, ContentDisposition.attachment().filename("demo-file.txt").build().toString()); // (4) Content-Disposition: attachment; filename="demo-file.txt" ... }
- (3) Мы устанавливаем заголовок
Content-Type: application/octet-stream
. Это установит MIME-типapplication/octet-stream
, чтобы указать, что ответ содержит двоичный файл. - (4) Мы также устанавливаем заголовок
Содержимое-Расположение: вложение;
. Это укажет браузеру, что ответ является вложением, и его следует сохранить какdemo-file.txt
Наконец, мы можем отправлять содержимое в виде байтов в ответ, полная реализация контроллера будет выглядеть следующим образом:
import org.springframework.http.ContentDisposition; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; @Controller public class DemoController { @GetMapping(value = "/demo-file-download") public ResponseEntitydemo() { // (1) Return byte array response String demoContent = "This is dynamically generated content in demo file"; // (2) Dynamic content HttpHeaders httpHeaders = new HttpHeaders(); httpHeaders.set(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_OCTET_STREAM_VALUE); // (3) Content-Type: application/octet-stream httpHeaders.set(HttpHeaders.CONTENT_DISPOSITION, ContentDisposition.attachment().filename("demo-file.txt").build().toString()); // (4) Content-Disposition: attachment; filename="demo-file.txt" return ResponseEntity.ok().headers(httpHeaders).body(demoContent.getBytes()); // (5) Return Response } }
- ((5)
demoContent.getBytes()
вернетбайт[]
. Метод вернет байты с http-заголовками для браузера для загрузки файла.
Запустите приложение, нажмите http://localhost:8080/demo-file-download
в браузере, demo-file.txt
будет автоматически загружен с фиктивным содержимым в нем.
Первоначально опубликовано по адресу: Все о Spring Framework
Оригинал: “https://dev.to/ashertoqeer/java-spring-download-file-from-controller-2ga5”