Рубрики
Без рубрики

Java Spring Загружает Файл С Контроллера

Бывают ситуации, когда нам нужно вернуть загружаемый файл, например, из метода контроллера… С пометкой java, программирование.

Бывают ситуации, когда нам нужно вернуть загружаемый файл из метода контроллера, например, нам может потребоваться вернуть динамический pdf-файл, сгенерированный из записей базы данных, или какой-либо csv-файл, содержащий записи, или какое-либо обработанное изображение и т.д.

Чтобы вернуть файл из контроллера spring, вам просто нужно вернуть байты с соответствующими заголовками. В этой статье будет объяснено, как загрузить файл из метода spring controller.

Допустим, у вас есть GET /demo-file-download конечная точка и мы хотим вернуть demo-file.txt с динамически создаваемым контентом. Наш метод контроллера будет выглядеть следующим образом:

    @GetMapping(value = "/demo-file-download")
    public ResponseEntity demo() { // (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 ResponseEntity demo() { // (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 ResponseEntity demo() { // (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”