1. 程式人生 > >img標籤src路徑不變,讀取不同圖片時,圖片不重新整理甚至不顯示

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