Поток Spring webflux динамически сконструировал большой zip-файл

#spring #stream #zip #spring-webflux #large-files

#spring #поток #zip #spring-webflux #большие файлы

Вопрос:

Я хотел бы создать конечную точку с помощью spring webflux, где я создаю zip-файл с несколькими файлами. Я также создаю эти файлы динамически из некоторых запросов к базе данных. Поскольку этот zip-файл может быть большим, я хочу немедленно передать обработанные данные клиенту, а не создавать весь zip-файл и возвращать его. Как мне этого добиться? Существует несколько объяснений MVC с внедрением HttpServletResponse , но в Spring Webflux такого нет. Вот что у меня есть до сих пор, но это просто загрузка «response.html «файл, и даже если я изменю его на «response.zip «, файл поврежден.

     @GetMapping(path = "/test", produces = "application/octet-stream")
    public Mono<ResponseEntity<FileSystemResource>> test(
        @ApiIgnore ServerHttpRequest request,
        @ApiIgnore ServerHttpResponse httpResponse
    ) {
        try {
            String str = "Hello";
            byte[] strToBytes = str.getBytes();
            FileSystemResource zipFile = new FileSystemResource("result.zip");
            ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipFile.getFile()));
            ZipEntry zipEntry = new ZipEntry("1/Hello.txt");
            out.putNextEntry(zipEntry);
            out.write(strToBytes);

            out.close();
            return Mono.just(ResponseEntity.ok()
                .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=result.zip")
                .contentType(MediaType.APPLICATION_OCTET_STREAM)
                .body(zipFile));
        } catch (Exception e) {
            e.printStackTrace();
            return Mono.empty();
        }
    }
    ```