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); 會發現,第一次讀取圖片時,能夠正常顯示。但是當伺服器圖片改變,再次呼叫該方法讀取圖片時,會發現顯示的還是之前的,這是因為讀取圖片的路徑和圖片名未發生變化,讀取的圖片是瀏覽器快取中的。
讀取方式改為:
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
- <jsp-descriptor>
- <page-check-seconds>0</page-check-seconds>
- </jsp-descriptor>
- <container-descriptor>
- <resource-reload-check-secs>0</resource-reload-check-secs>
- </container-descriptor>
- <?xml version="1.0" encoding="UTF-8" ?>
- <weblogic-web-app xmlns="http://xmlns.oracle.com/weblogic/weblogic-web-app">
- <context-root>/VTA</context-root>
- <jsp-descriptor>
- <page-check-seconds>0</page-check-seconds>
- </jsp-descriptor>
- <container-descriptor>
- <prefer-web-inf-classes>true</prefer-web-inf-classes>
- <resource-reload-check-secs>0</resource-reload-check-secs>
- </container-descriptor>
- </weblogic-web-app>
至此,該問題解決,花了一下午時間才解決這個問題,所以記錄,同時希望能幫助遇到相同問題的苦逼網友。
============================================================================================
5. 再補充點東西
如果服務端不完整,也可能會遇到類似問題,貼出部分程式碼,關鍵程式碼標為紅色,供參考:
- public void getPictureByName(String name,HttpServletRequest request,HttpServletResponse response){
- try {
- BufferedImage bi = fileService.getPicture( name );
- int index = name.lastIndexOf(".");
- String formate = name.substring(index+1);
- OutputStream os = response.getOutputStream();
- ImageIO.write(bi, formate, os);
- os.close();
- } catch (Exception e) {
- e.printStackTrace();
- }finally{
- }
- }
若上述程式碼仍無法解決問題,可參考連結
http://www.iteye.com/problems/48877