接口获取图片文件流的缓存问题

最近在做新闻管理的后台,发现图片请求的非常慢,加载过的图片依然重新加载。

这里我是用controller返回图片的,所以每次请求图片的时候会进入controller中然后返回图片,每次返回的responsebody size都会略大于图片大小。

但是在请求tomcat静态资源时,首次加载时和上面情况类似,但是下次刷新responsebody就只有几十b的大小。

一开始没有清空缓存,以为tomcat把图片压缩成几十b大小,感觉这也太不可思议了,但是还是选择尝试一下。在controller中用gzip对图片资源进行压缩


public final class GzipUtil {
    public static byte[] compress(byte[] data) {
        ByteArrayOutputStream byteOutput = new ByteArrayOutputStream(1024);
        GZIPOutputStream output = null;
        try {
            System.out.println("before:"+data.length);
            output = new GZIPOutputStream(byteOutput);
            output.write(data);
        } catch (IOException e) {
        } finally {
            try {
                output.close();
            } catch (IOException e) {
            }
        }
        return byteOutput.toByteArray();
    }
}
 @ResponseBody
    @RequestMapping("img/{id}.jpg")
    public ResponseEntity<byte[]> getImg(@PathVariable Long id,HttpServletRequest request) throws IOException {


       
        HttpHeaders headers = new HttpHeaders();
//      String encoding = request.getHeader( "accept-encoding" );
        headers.setContentType(MediaType.IMAGE_JPEG);
        byte[] data ;
       	if((encoding != null) && (encoding.indexOf( "gzip" ) != -1)){
//            "Content-Encoding", "gzip"
            headers.set("Content-Encoding","gzip");
            data = GzipUtil.compress(FileUtils.readFileToByteArray(new File(imgBasePath+id+".jpg")));
            System.out.println("data size "+data.length);
        }else{
            data =  FileUtils.readFileToByteArray(new File(imgBasePath+id+".jpg"));
        }
        
        headers.setContentLength(data.length);

        return new ResponseEntity<byte[]>(data, headers,
            HttpStatus.CREATED);



    }

 先判断浏览器是否支持 gzip,如果支持使用gzip压缩。

然后在浏览器测试,发现压缩后的responseboy只比压缩前少了几k,看来并不是这个原因


后来清空chrom浏览器缓存(command+shift+R )后发现每次请求和controller请求图片一样。所以可以判断为缓存问题

tomcat :

缓存前

requestheader:

    1. Accept:
      text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
    2. Accept-Encoding:
      gzip, deflate
    3. Accept-Language:
      zh-CN,zh;q=0.8,en;q=0.6
    4. Cache-Control:
      max-age=0
    5. Connection:
      keep-alive
    6. Cookie:
      Hm_lvt_fbd153e223cf03f359f3793430d98ad0=1502073972,1502160655,1502250279; Hm_lpvt_fbd153e223cf03f359f3793430d98ad0=1502262568; JSESSIONID=DBF618B52AB5792C63B8EF60896CEB23
    7. Host:
      smartsowo.com
    8. If-Modified-Since:
      Mon, 07 Aug 2017 03:04:22 GMT
    9. If-None-Match:
      W/"3864-1502075062000"
    10. Referer:
      http://smartsowo.com/
    11. Upgrade-Insecure-Requests:
      1
    12. User-Agent:
      Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Mobile Safari/537.36
Name

 
logo.png
favicon.ico

  1. Accept:
    text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
  2. Accept-Encoding:
    gzip, deflate
  3. Accept-Language:
    zh-CN,zh;q=0.8,en;q=0.6
  4. Cache-Control:
    no-cache
  5. Connection:
    keep-alive
  6. Cookie:
    Hm_lvt_fbd153e223cf03f359f3793430d98ad0=1502073972,1502160655,1502250279; Hm_lpvt_fbd153e223cf03f359f3793430d98ad0=1502262568; JSESSIONID=B178B1C8029776152BBF8EC3FFEF89F4
  7. Host:
    smartsowo.com
  8. Pragma:
    no-cache
  9. Referer:
    http://smartsowo.com/
  10. Upgrade-Insecure-Requests:
    1
  11. User-Agent:
    Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Mobile Safari/537.36

  1. 缓存后
  2. requestheader
    1. Accept:
      text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
    2. Accept-Encoding:
      gzip, deflate
    3. Accept-Language:
      zh-CN,zh;q=0.8,en;q=0.6
    4. Cache-Control:
      max-age=0
    5. Connection:
      keep-alive
    6. Cookie:
      Hm_lvt_fbd153e223cf03f359f3793430d98ad0=1502073972,1502160655,1502250279; Hm_lpvt_fbd153e223cf03f359f3793430d98ad0=1502262568; JSESSIONID=B178B1C8029776152BBF8EC3FFEF89F4
    7. Host:
      smartsowo.com
    8. If-Modified-Since:
      Mon, 14 Aug 2017 03:08:20 GMT
    9. If-None-Match:
      W/"3864-1502680100000"
    10. Referer:
      http://smartsowo.com/
    11. Upgrade-Insecure-Requests:
      1
    12. User-Agent:
      Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Mobile Safari/537.36
    13. 通过 Cache-Control的值来判断缓存中是否有这个资源文件,如果有这个文件的缓存,则 通过
      If-Modified-Since和
      If-None-Match值来判断资源文件是否被修改,如果修改重新加载资源返回201 ,页面重新加载图片,如果没有修改则返回304 返回空的responsebody


      1.     @ResponseBody
            @RequestMapping("img/{id}.jpg")
            public ResponseEntity<byte[]> getImg(@PathVariable Long id,HttpServletRequest request) throws IOException {
        
        
                String cacheControl = request.getHeader("Cache-Control");
                if (cacheControl!=null&&!cacheControl.equals("no-cache")){
                    return new ResponseEntity<byte[]>( new HttpHeaders(),
                        HttpStatus.NOT_MODIFIED);
                }
        
        
               /* String eTag = request.getHeader("If-None-Match");
                System.out.println(eTag);
                if(eTag!=null&&eTag.equals("W/\""+id+"\"")){
                    return new ResponseEntity<byte[]>( new HttpHeaders(),
                        HttpStatus.NOT_MODIFIED);
                }*/
                HttpHeaders headers = new HttpHeaders();
        //        String encoding = request.getHeader( "accept-encoding" );
                headers.setContentType(MediaType.IMAGE_JPEG);
                byte[] data ;
               /* if((encoding != null) && (encoding.indexOf( "gzip" ) != -1)){
        //            "Content-Encoding", "gzip"
                    headers.set("Content-Encoding","gzip");
                    data = GzipUtil.compress(FileUtils.readFileToByteArray(new File(imgBasePath+id+".jpg")));
                    System.out.println("data size "+data.length);
                }else{
                    data =  FileUtils.readFileToByteArray(new File(imgBasePath+id+".jpg"));
                }*/
                data =  FileUtils.readFileToByteArray(new File(imgBasePath+id+".jpg"));
                headers.setContentLength(data.length);
        //        headers.setCacheControl("no-cache");
                headers.setETag("W/\""+id+"\"");
                headers.setLastModified(new Date().getTime());
        
        
        //        APPLICATION_OCTET_STREAM
        
                //图片直接下载,导致app无法正常显示
        //        headers.setContentDispositionFormData("attachment", id+".jpg");
                return new ResponseEntity<byte[]>(data, headers,
                    HttpStatus.CREATED);
        
        
        
            }






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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值