img标签src路径不变,读取不同图片时,图片不刷新甚至不显示

问题描述:

1. Linux操作系统,weblogic服务器下部署应用,IE9浏览器从服务器取图片显示,相同src ,但图片不同,第一次读图片,能够显示。当后一张图片覆盖前一张图片后,再次读取图片,会显示不全或图片不显示。

2. 服务端报错

  •  Servlet failed with IOException
  • java.io.IOException: failed to read '912' bytes from InputStream; clen: 21232 remaining: 14000 count: 7232

解决过程说明:

1. html标签如下,服务器中无图片时,显示images/pnLeft.jpg

<img id = 'signaturephoto' src = 'images/pnLeft.jpg'/><br/>

2. 假定,从服务器取图片路径为var imgurl = http://10.1.21.113:7001/VTA/businessPicture/2015/09/11/requestpicture.jpg

读取图片方式:$("#"+pictureTag).attr("src",imgurl); 会发现,第一次读取图片时,能够正常显示。但是当服务器图片改变,再次调用该方法读取图片时,会发现显示的还是之前的,这是因为读取图片的路径和图片名未发生变化,读取的图片是浏览器缓存中的。

读取方式改为:$("#signaturephoto").attr("src",imgurl+"?t="+Math.random());在路径后面加随机数,让浏览器检测到变化,从而绕过缓存读取服务器中的图片。

3. 更复杂的问题,通过上述做法,能够让浏览器获得改变的图片,但会显示图片不全或图片无法获取的问题。且服务端报错,如下:

  • <BEA-101019> Servlet failed with IOException
  • java.io.IOException: failed to read '912' bytes from InputStream; clen: 21232 remaining: 14000 count: 7232
  • at weblogic.servlet.internal.ChunkOutput.writeStream(ChunkOutput.java:466)
  • at weblogic.servlet.internal.ChunkOutputWrapper.writeStream(ChunkOutputWrapper.java:192)
  • at weblogic.servlet.internal.ServletOutputStreamImpl.writeStream(ServletOutputStreamImpl.java:555)
  • at weblogic.servlet.internal.ServletOutputStreamImpl.writeStream(ServletOutputStreamImpl.java:543)
  • at weblogic.servlet.FileServlet.sendFile(FileServlet.java:410)
  • at weblogic.servlet.FileServlet.doGetHeadPost(FileServlet.java:234)
  • at weblogic.servlet.FileServlet.service(FileServlet.java:173)
  • at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
  • at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
  • at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
  • at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:301)
  • at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:26)
  • at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
  • at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
  • at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
  • at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
  • at weblogic.servlet.internal.RequestEventsFilter.doFilter(RequestEventsFilter.java:27)
  • at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
  • at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3730)
  • at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3696)
  • at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
  • at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120)
  • at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2273)
  • at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2179)
  • at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1490)
  • at weblogic.work.ExecuteThread.execute(ExecuteThread.java:256)
  • at weblogic.work.ExecuteThread.run(ExecuteThread.java:221)

4. 遇到上述问题,在百度上搜了一大,均是不靠谱的答案,最后在java的stackoverflow社区找到了解决方案,还是正规途径靠谱,没有谷歌可坑苦了国内的开发猿们,嘻嘻。

如下,在weblogic.xml中添加如下代码,即可解决上述问题,给出链接,可自行查看http://stackoverflow.com/questions/12001339/file-transfer-failing-with-weblogic-java-io-ioexception-failed-to-read-2607

 
 
  1. <jsp-descriptor>
  2. <page-check-seconds>0</page-check-seconds>
  3. </jsp-descriptor>
  4. <container-descriptor>
  5. <resource-reload-check-secs>0</resource-reload-check-secs>
  6. </container-descriptor>
weblogic.xml的完整配置如下

  1. <?xml version="1.0" encoding="UTF-8" ?>     
  2. <weblogic-web-app xmlns="http://xmlns.oracle.com/weblogic/weblogic-web-app"> 
  3.     <context-root>/VTA</context-root>  
  4. <jsp-descriptor>
  5. <page-check-seconds>0</page-check-seconds>
  6. </jsp-descriptor>
  7.     <container-descriptor>   
  8.         <prefer-web-inf-classes>true</prefer-web-inf-classes>   
  9. <resource-reload-check-secs>0</resource-reload-check-secs>
  10.     </container-descriptor>  
  11. </weblogic-web-app>  

至此,该问题解决,花了一下午时间才解决这个问题,所以记录,同时希望能帮助遇到相同问题的苦逼网友。

============================================================================================

5. 再补充点东西

如果服务端不完整,也可能会遇到类似问题,贴出部分代码,关键代码标为红色,供参考:

  1. public void getPictureByName(String name,HttpServletRequest request,HttpServletResponse response){
  2. try {
  3.    BufferedImage bi = fileService.getPicture( name );
  4.    int index = name.lastIndexOf(".");
  5.    String formate = name.substring(index+1);
  6.  OutputStream os = response.getOutputStream();
  7. ImageIO.write(bi, formate, os);
  8. os.close();
  9. } catch (Exception e) {
  10. e.printStackTrace();
  11. }finally{
  12. }
  13.   }

若上述代码仍无法解决问题,可参考链接

http://www.iteye.com/problems/48877


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值