spring boot中实现响应图片的方法以及改进
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring boot中实现响应图片的方法以及改进相关的知识,希望对你有一定的参考价值。
Controller响应,喷出图片,是一个很常见的功能,代码如下
@RequestMapping(value = { "/img/{filename:.+}" }, method = RequestMethod.GET, produces = {
MediaType.IMAGE_JPEG_VALUE, MediaType.IMAGE_GIF_VALUE, MediaType.IMAGE_PNG_VALUE })
@ResponseBody
public byte[] getImg(@PathVariable String filename) {
System.out.println("filename:" + filename);
Path path = Paths.get("c:/upload/img/" + filename);
byte[] data = null;
try {
data = Files.readAllBytes(path);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return data;
}
但是有个问题,即使每次请求的图片都相同,请求都会如实运行,增加了服务器的负担,如果能够强迫浏览器使用本地缓存,发送304请求。那就很大程度上降低了服务器的压力。
之前写过一个博客《HTTP 缓存概念和强迫浏览器使用缓存的示例》,正好可以借鉴,在java中实现即可。
思路很简单,就是用If-Modified-Since的时间和文件的时间作比较,如果文件的LastModified时间未更新,则返回304,强迫使用缓存。
但是在实现的时候,发现似乎很麻烦。
原因就是If-Modified-Since的格式问题,chrome浏览器中返回的是
"Sat Sep 23 23:08:37 CST 2017"
在FireForx中格式类似:
2017-09-22T22:02:44.592+08:00
这就导致处理字符串转Date类型的时候,无所适从。尤其需要吐槽的是java中的时间类真的太难用了,后来知道有joda类库,确实很好用,但是在转换If-Modified-Since这个时间的时候,对上述问题也束手无策。除非自己实现一个万能的时间转换器。
本文出自 “一只博客” 博客,请务必保留此出处http://cnn237111.blog.51cto.com/2359144/1968180
以上是关于spring boot中实现响应图片的方法以及改进的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Spring Boot 中实现 oAuth2 和 JWT 身份验证? [关闭]
如何在 Spring Boot 应用程序中实现长轮询 REST 端点?