У меня есть два метода, возвращающих CompletableFuture в @RestController:
@RestController
public class SampleController {
@GetMapping("/string")
public CompletableFuture<String> string() {
return CompletableFuture.supplyAsync(() -> " test123 ")
.thenApply(String::trim)
.thenApply(String::toUpperCase);
}
@GetMapping("/file")
public CompletableFuture<FileSystemResource> fileSystemResource() {
return CompletableFuture.supplyAsync(() -> new File("file.txt"))
.thenApply(file -> {
try {
return zipFile(file);
} catch (IOException e) {
throw new RuntimeException(e);
}
})
.thenApply(FileSystemResource::new);
}
private File zipFile(File fileToZip) throws IOException {
File zippedFile = new File("zipped.zip");
FileOutputStream fos = new FileOutputStream(zippedFile);
ZipOutputStream zipOut = new ZipOutputStream(fos);
FileInputStream fis = new FileInputStream(fileToZip);
ZipEntry zipEntry = new ZipEntry(fileToZip.getName());
zipOut.putNextEntry(zipEntry);
byte[] bytes = new byte[1024];
int length;
while ((length = fis.read(bytes)) >= 0) {
zipOut.write(bytes, 0, length);
}
zipOut.close();
fis.close();
fos.close();
return zippedFile;
}
}
Первый возвращает ожидаемый объект String, а второй возвращает некоторый хешированный текст, такой как "PK¸ £ {Mfile.txtKÊILÊIT (.(ÊÌKW0PKム{TPK¸ £ {Mム{Tfile.txtPK6G ". File.txt существует в classpath.
Почему я не получаю заархивированный файл? Я использую Spring Boot 1.5.17.RELEASE
Точно такой же метод в проекте с Spring Boot 2.1.0. Версия RELEASE возвращает красивый zip-файл.
Обработка потоков не является предметом этого обсуждения.