Как передать байтовый массив в UI и загрузить его асинхронно при весенней загрузке - PullRequest
0 голосов
/ 09 января 2020

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

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 09 января 2020

Взгляните на StreamingResponseBody

Тип возвращаемого значения метода контроллера для асинхронной обработки запроса, когда приложение может записывать непосредственно в ответ OutputStream, не задерживая поток контейнера сервлета. ,

(также обратите внимание на Note , упомянутый в javado c!)

Например, если вы хотите загрузить CSV с именем "example.csv":

@GetMapping("/downloadCsv")
public ResponseEntity<StreamingResponseBody> downloadCsv() {
  HttpHeaders httpHeaders = new HttpHeaders();
  httpHeaders.setContentType("text/csv");
  httpHeaders.setContentDisposition(ContentDisposition.builder("attachment").filename("example.csv").build());

  return () ->
    new ResponseEntity<>(
      outputStream -> downloadService.downloadCsv("example.csv" outputStream),
      httpHeaders,
      HttpStatus.OK);
}

Поскольку вы не сообщили нам, какой пользовательский интерфейс вы используете, я сосредоточился на серверной части.

0 голосов
/ 09 января 2020

API загрузки файла контроллера Spring

@GetMapping("/files")
    public HttpEntity<byte[]> getFile() throws IOException {
        String filePath = "C:\\Users\\Jaganath Kamble\\Desktop\\distribution_file20.xls";
        byte[] bytes = Files.readAllBytes(Paths.get(filePath));
        HttpHeaders header = new HttpHeaders();
        header.setContentType(MediaType.APPLICATION_PDF);
        header.set(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=distribution_file20.xls");
        header.setContentLength(bytes.length);
        return new HttpEntity<>(bytes, header);
    }

ниже - jsp

!DOCTYPE html>
<html lang="en">
<head>
    <title>Welcome</title>
    <link href="webjars/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet">
    <link href="css/custom.css" rel="stylesheet">
</head>
<body>
    <div class="container">
        <h2 class="hello-title">Hello ${name}!</h2>
        <table class="table table-striped">
            <caption>Your todos are</caption>
            <thead>
                <tr>
                    <th>Description</th>
                    <th>Target Date</th>
                    <th>Is it Done?</th>
                    <th>Edit</th>
                    <th>Delete</th>
                </tr>
            </thead>
            <tbody>
                <tr>
                    <td>Todo 1</td>
                    <td>10/12/2017</td>
                    <td>No</td>
                    <td><a class="btn btn-warning" href="/edit-todo">Edit Todo</a></td>
                    <td><a class="btn btn-warning" href="/delete-todo">Delete Todo</a></td>
                </tr>
            </tbody>
        </table>
        <div>
            <a class="btn btn-default" href="/add-todo">Add a Todo</a>
        </div>
        <script src="webjars/jquery/1.9.1/jquery.min.js"></script>
        <script src="webjars/bootstrap/3.3.6/js/bootstrap.min.js"></script>
        <script type="text/javascript">
            fetch(${pageContext.request.contextPath}'/files')
              .then(resp => resp.blob())
              .then(blob => {
                const url = window.URL.createObjectURL(blob);
                const a = document.createElement('a');
                a.style.display = 'none';
                a.href = url;
                a.download = 'distribution_file20.xls';
                document.body.appendChild(a);
                a.click();
                window.URL.revokeObjectURL(url);
                alert('your file has downloaded!'); // or you know, something with better UX...
              }).catch(() => alert('oh no!'));
        </script>
    </div>
</body>
</html>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...