I have the following endpoint code to serve PDF files.
@RequestMapping ResponseEntity<byte[]> getPDF() { File file = ...; byte[] contents = null; try { try (FileInputStream fis = new FileInputStream(file)) { contents = new byte[(int) file.length()]; fis.read(contents); } } catch(Exception e) { // error handling } HttpHeaders headers = new HttpHeaders(); headers.setContentDispositionFormData(file.getName(), file.getName()); headeres.setCacheControl("must-revalidate, post-check=0, pre-check=0"); return new ResponseEntity<>(contents, headers, HttpStatus.OK); }
How can I convert above into a reactive type Flux/Mono
and DataBuffer
.
I have check DataBufferUtils
but It doesn’t seem to offer what I needed. I didn’t find any example either.
Advertisement
Answer
The easiest way to achieve that would be with a Resource
.
@GetMapping(path = "/pdf", produces = "application/pdf") ResponseEntity<Resource> getPDF() { Resource pdfFile = ...; HttpHeaders headers = new HttpHeaders(); headers.setContentDispositionFormData(file.getName(), file.getName()); return ResponseEntity .ok().cacheControl(CacheControl.noCache()) .headers(headers).body(resource); }
Note that DataBufferUtils
has some useful methods there that convert an InputStream
to a Flux<DataBuffer>
, like DataBufferUtils#read()
. But dealing with a Resource
is still superior.