gpt4 book ai didi

java - Spring WebFlux : Serve files from controller

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:19:56 24 4
gpt4 key购买 nike

来自 .NET 和 Node 我真的很难弄清楚如何将这个阻塞的 MVC Controller 转移到一个非阻塞的 WebFlux 注释 Controller ?我理解了这些概念,但未能找到合适的异步 Java IO 方法(我希望它返回 Flux 或 Mono)。

@RestController
@RequestMapping("/files")
public class FileController {

@GetMapping("/{fileName}")
public void getFile(@PathVariable String fileName, HttpServletResponse response) {
try {
File file = new File(fileName);
InputStream in = new java.io.FileInputStream(file);
FileCopyUtils.copy(in, response.getOutputStream());
response.flushBuffer();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}

最佳答案

首先,使用 Spring MVC 实现它的方法应该更像这样:

@RestController
@RequestMapping("/files")
public class FileController {

@GetMapping("/{fileName}")
public Resource getFile(@PathVariable String fileName) {
Resource resource = new FileSystemResource(fileName);
return resource;
}
}

此外,并不是说如果您只是在没有额外逻辑的情况下为这些资源提供服务,您可以使用 Spring MVC 的 static resource support .使用 Spring Boot,spring.resources.static-locations可以帮助您自定义位置。

现在,使用 Spring WebFlux,您还可以配置相同的 spring.resources.static-locations提供静态资源的配置属性。

它的 WebFlux 版本看起来完全一样。如果你需要执行一些涉及一些 I/O 的逻辑,你可以返回一个 Mono<Resource>而不是 Resource直接,像这样:

@RestController
@RequestMapping("/files")
public class FileController {

@GetMapping("/{fileName}")
public Mono<Resource> getFile(@PathVariable String fileName) {
return fileRepository.findByName(fileName)
.map(name -> new FileSystemResource(name));
}
}

请注意,对于 WebFlux,如果返回 Resource实际上是磁盘上的一个文件,我们将利用 zero-copy mechanism这将使事情更有效率。

关于java - Spring WebFlux : Serve files from controller,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49259156/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com