1. 前言
最近要开发一个把服务端的文件展示给前台的接口,有各种不同类型的文件,在通常情况下我们会想到使用 IO 把文件流写到响应的输出流中,但是不够优雅。今天分享一个借助于 Spring MVC 视图的功能来实现各种文件的读取并返给前端下载或者展示。
2. View
View
是 Spring MVC 的视图抽象,它有不少有用的实现类:
view的主要实现关系
好像有些东西我们并不陌生,比如AbstractXlsView
,我们在 Excel 导出的教程见过它。另外几个是 PDF 视图、JSON 视图和 FreeMarker 视图,还有其它一些实现但是并不常用,因此就不一一列举了。
3. 实现
如果 Excel 和 PDF 都能够以视图的方式响应给前端,那么其它文件也应该是可以的。根据上面的类图很容易想出来继承AbstractView
实现其预留的抽象方法就可以了。这里以jpg
图片为例来试一试,照着上面的几个进行模仿就行了:
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