StreamingResponseBody возвращает пустой файл - PullRequest
0 голосов
/ 26 мая 2019

Я пытаюсь создать службу отдыха для загрузки файлов из репозитория, используя Springboot.

Я пытаюсь вернуть ResponseEntity с StreamingResponseBody, чтобы вернуть файл, который я получаю из хранилища, в качестве InputStream.

Это текущий код, который у меня есть:


@GetMapping(path = "/downloadFile")
    public ResponseEntity<StreamingResponseBody> downloadFile(@RequestParam(value = "documentId") String documentId,
            HttpServletRequest request, HttpServletResponse response) throws InterruptedException, IOException {

        InputStream is = downloadService.getDocument(documentId);

        StreamingResponseBody out = outputStream -> {

            outputStream.write(IOUtils.toByteArray(is));
        };

        HttpHeaders headers = new HttpHeaders();
        headers.add("Content-Type", "text/csv");
        headers.add("Content-Disposition", "attachment; filename=" + documentId);
        headers.add("Pragma", "no-cache");
        headers.add("Cache-Control", "no-cache");

        return (new ResponseEntity<>(out, headers, HttpStatus.OK));

    }

Когда я использую эту конечную точку, используя непосредственно браузер или почтальона, загружаемый файл становится пустым. Я понимаю, что OutputStream записывается в асинхронном режиме (Async включен в классе конфигурации).

Как я могу использовать этот сервис и полностью записать файл, как это происходит из репозитория, который я использую? (если возможно, используя Почтальон, только для тестирования)

Правильно ли я строю сервис?

1 Ответ

0 голосов
/ 26 мая 2019

Я немного изменил код, в моем documentId - имя файла для загрузки. Я проверил, все работает нормально. Проверьте ниже код.

@GetMapping(path = "/downloadFile")
  public ResponseEntity<StreamingResponseBody> downloadFile(
      @RequestParam(value = "documentId") String documentId,
      HttpServletRequest request,
      HttpServletResponse response)
      throws InterruptedException, IOException {
    String dirPath = "E:/sure-delete/"; //Directory having the files
    InputStream inputStream = new FileInputStream(new File(dirPath + documentId));
    final StreamingResponseBody out =
        outputStream -> {
          int nRead;
          byte[] data = new byte[1024];
          while ((nRead = inputStream.read(data, 0, data.length)) != -1) {
            System.out.println("Writing some bytes of file...");
            outputStream.write(data, 0, nRead);
          }
        };
    HttpHeaders headers = new HttpHeaders();
    headers.add("Content-Type", "text/csv");
    headers.add("Content-Disposition", "attachment; filename=" + documentId);
    headers.add("Pragma", "no-cache");
    headers.add("Cache-Control", "no-cache");
    return (new ResponseEntity<>(out, headers, HttpStatus.OK));
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...