#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();
}
}
```