Spring MVC的视图居然还能把文件展现给前端

2020-11-17 11:51:09 浏览数 (1)

1. 前言

最近要开发一个把服务端的文件展示给前台的接口,有各种不同类型的文件,在通常情况下我们会想到使用 IO 把文件流写到响应的输出流中,但是不够优雅。今天分享一个借助于 Spring MVC 视图的功能来实现各种文件的读取并返给前端下载或者展示。

2. View

View是 Spring MVC 的视图抽象,它有不少有用的实现类:

view的主要实现关系

好像有些东西我们并不陌生,比如AbstractXlsView,我们在 Excel 导出的教程见过它。另外几个是 PDF 视图、JSON 视图和 FreeMarker 视图,还有其它一些实现但是并不常用,因此就不一一列举了。

3. 实现

如果 Excel 和 PDF 都能够以视图的方式响应给前端,那么其它文件也应该是可以的。根据上面的类图很容易想出来继承AbstractView实现其预留的抽象方法就可以了。这里以jpg图片为例来试一试,照着上面的几个进行模仿就行了:

代码语言:javascript复制
public class ImageView extends AbstractView {

    public ImageView(String contentType) {
        setContentType(contentType);
    }

    @Override
    protected void renderMergedOutputModel(Map<String, Object> model, HttpServletRequest request, HttpServletResponse response) throws Exception {
       // 模拟读取文件 并转化为文件输入流
        ClassPathResource classPathResource = new ClassPathResource("./qr.jpg");
        FileInputStream fileInputStream = new FileInputStream(classPathResource.getFile());

        byte[] bytes = new byte[1024];
        // 利用 AbstractView 已经提供的方法 创建临时输出流
        ByteArrayOutputStream baos = super.createTemporaryOutputStream();
        int len;
        //  对文件进行读写
        while ((len = fileInputStream.read(bytes)) != -1){
            baos.write(bytes,0,len);
        }
        // 然后把临时输出流中的数据 写入响应中
        super.writeToResponse(response, baos);
    }
}

构造方法中的 contentType 要符合 mime 规范并满足你的需求。

完成了上面的实现后,我们展示图片的接口就能这么写:

代码语言:javascript复制
@GetMapping("/show")
public ModelAndView img() {
    ModelAndView modelAndView = new ModelAndView();
    modelAndView.setView(new ImageView(MimeTypeUtils.IMAGE_JPEG_VALUE));
    return modelAndView;
}

4. 总结

在 JSON 大行其道的今天,在 Spring MVC 开发接口的时候已经很少用到了模型和视图,今天通过上面的示例来看视图依然有很大的用途。其它玩法可以参考这个思路,留给你自己探索。请持续关注:码农小胖哥 获取更多有用的编程实战经验。

Spring Security 实战干货:OAuth2授权请求是如何构建并执行的

2020-11-10

Spring Security 实战干货:客户端OAuth2授权请求的入口在哪里

2020-11-07

Spring Security 实战干货:OAuth2第三方授权初体验

2020-11-06

0 人点赞