一尘不染

如何在Spring以被动方式提供文件/ PDF文件

spring-boot

我有以下端点代码可提供PDF文件。

@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);
}

我如何才能将上面转换为反应类型Flux/MonoDataBuffer

我有支票,DataBufferUtils但似乎没有提供我需要的东西。我也没有找到任何例子。


阅读 296

收藏
2020-05-30

共1个答案

一尘不染

最简单的方法是使用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);
}

请注意,这里DataBufferUtils有一些将InputStreama
转换为a的有用方法Flux<DataBuffer>,例如DataBufferUtils#read()。但是处理a Resource仍然更好。

2020-05-30