当前位置: 首页 > 知识库问答 >
问题:

Spring WebFlux:从控制器提供文件

宰父子安
2023-03-14

来自。NET和Node的我真的很难弄清楚如何将这个阻塞的MVC控制器转移到一个非阻塞的WebFlux注释控制器?我已经理解了这些概念,但是没有找到合适的异步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();
        }
    }
}

共有1个答案

詹唯
2023-03-14

首先,使用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的静态资源支持。使用Spring Boot,Spring.resources.static-locations可以帮助您自定义位置。

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

它的WebFlux版本看起来完全相同。如果需要执行一些涉及I/O的逻辑,可以返回一个 而不是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,如果返回的资源实际上是磁盘上的一个文件,我们将利用零拷贝机制来提高效率。

 类似资料:
  • 我试图实现的是从main方法获取控制器实例,这样我就可以从另一个类调用控制器的方法并更新fxml。总之,这是我的代码: 主要类别: 我的控制器类: 试图调用控制器方法的类: 下面是我的错误信息: ConnectionHandling类:

  • 我得到这个错误消息: 无法写入JSON: 未找到用于java.io.FileDescriptor类的序列化程序,也未发现用于创建BeanSerializer的属性 (为了避免异常,禁用SerializationFeature.fail_on_empty_beans)) (通过引用链: org.springframework.core.io.filesystemResource[\“outputSt

  • 当在OS X上使用Chrome或Safari访问此控制器方法时,开发人员工具报告请求被取消--没有收到响应,无论是200还是404。我已经确认了SimpleResponse实际上是由这个控制器操作在请求上返回的。我希望它能提供一个好的响应,但是Play不能完成响应,或者我的浏览器不能接受它。我是在这里做了什么错误的回应,还是在框架中偶然发现了一个bug? 我的游戏版本是2.1.3。

  • 我尝试使用过滤器和拦截器来修改从控制器方法提交的响应,但我无法这样做,因为在执行过滤器或拦截器之前提交了响应。我知道我们还有另一种选择,但这不是我正确的地方,因为目的是根据HTTP状态修改响应。如果有人有想法,请告诉我,我如何通过Spring启动和Rest来实现

  • 我对Spring比较陌生,所以我只是尝试从Spring控制器中呈现一个jsp页面。然而,我一直收到一个白色标签错误页面。我已经尝试了几乎所有可能的方法来解决这个错误,但我似乎无法找出是什么导致了404。有什么建议吗 项目结构:

  • 因此,我将一个名为“size”的整数保存到一个名为SettingsStageController的控制器类中。java和我希望通过另一个名为GameStageController的控制器类文件访问该变量。java,但我似乎不知道怎么做。 设置标记控制器。JAVA GameStageController.java