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这个时间的时候,对上述问题也束手无策。除非自己实现一个万能的时间转换器。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值