javax.imageio.IIOException: Can't create output stream!(驗證碼圖片不顯示)
- 問題
- 分析
- 解決方案
- 1.在tomcat檔案夾里創建個temp檔案夾
- 2.添加ImageIO.setUseCache(false);陳述句
問題
今天遇到個很怪的問題,在機房電腦運行代碼時,驗證碼圖片可以生成,回來在自己的電腦運行就不可以了,驗證碼圖片加載不出現,單獨訪問生成驗證碼的CheckCodeServlet時,報了下面的錯誤(在機房是可以訪問的),
HTTP狀態 500 - 內部服務器錯誤
型別 例外報告
訊息 Can't create output stream!
描述 服務器遇到一個意外的情況,阻止它完成請求,
例外情況
javax.imageio.IIOException: Can't create output stream!
javax.imageio.ImageIO.write(ImageIO.java:1574)
com.neuedu.his.controller.CheckCodeServlet.doPost(CheckCodeServlet.java:85)
com.neuedu.his.controller.CheckCodeServlet.doGet(CheckCodeServlet.java:89)
javax.servlet.http.HttpServlet.service(HttpServlet.java:626)
javax.servlet.http.HttpServlet.service(HttpServlet.java:733)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
com.neuedu.his.filter.LoginFilter.doFilter(LoginFilter.java:57)
com.neuedu.his.filter.CharsetFilter.doFilter(CharsetFilter.java:37)
com.neuedu.his.filter.Filter1.doFilter(Filter1.java:29)
根本原因,
javax.imageio.IIOException: Can't create cache file!
javax.imageio.ImageIO.createImageOutputStream(ImageIO.java:423)
javax.imageio.ImageIO.write(ImageIO.java:1572)
com.neuedu.his.controller.CheckCodeServlet.doPost(CheckCodeServlet.java:85)
com.neuedu.his.controller.CheckCodeServlet.doGet(CheckCodeServlet.java:89)
javax.servlet.http.HttpServlet.service(HttpServlet.java:626)
javax.servlet.http.HttpServlet.service(HttpServlet.java:733)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
com.neuedu.his.filter.LoginFilter.doFilter(LoginFilter.java:57)
com.neuedu.his.filter.CharsetFilter.doFilter(CharsetFilter.java:37)
com.neuedu.his.filter.Filter1.doFilter(Filter1.java:29)
根本原因,
java.nio.file.AccessDeniedException: D:\Program Files\apache\apache-tomcat-8.5.60\temp\imageio8447768555205008617.tmp
sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:83)
sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:97)
sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:102)
sun.nio.fs.WindowsFileSystemProvider.newByteChannel(WindowsFileSystemProvider.java:230)
java.nio.file.Files.newByteChannel(Files.java:361)
java.nio.file.Files.createFile(Files.java:632)
java.nio.file.TempFileHelper.create(TempFileHelper.java:138)
java.nio.file.TempFileHelper.createTempFile(TempFileHelper.java:161)
java.nio.file.Files.createTempFile(Files.java:897)
javax.imageio.stream.FileCacheImageOutputStream.<init>(FileCacheImageOutputStream.java:88)
com.sun.imageio.spi.OutputStreamImageOutputStreamSpi.createOutputStreamInstance(OutputStreamImageOutputStreamSpi.java:68)
javax.imageio.ImageIO.createImageOutputStream(ImageIO.java:419)
javax.imageio.ImageIO.write(ImageIO.java:1572)
com.neuedu.his.controller.CheckCodeServlet.doPost(CheckCodeServlet.java:85)
com.neuedu.his.controller.CheckCodeServlet.doGet(CheckCodeServlet.java:89)
javax.servlet.http.HttpServlet.service(HttpServlet.java:626)
javax.servlet.http.HttpServlet.service(HttpServlet.java:733)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
com.neuedu.his.filter.LoginFilter.doFilter(LoginFilter.java:57)
com.neuedu.his.filter.CharsetFilter.doFilter(CharsetFilter.java:37)
com.neuedu.his.filter.Filter1.doFilter(Filter1.java:29)
):注意 主要問題的全部 stack 資訊可以在 server logs 里查看
Apache Tomcat/8.5.60
分析
報錯的的核心三句:
javax.imageio.IIOException: Can't create output stream!
javax.imageio.IIOException: Can't create cache file!
java.nio.file.AccessDeniedException: D:\Program Files\apache\apache-tomcat-8.5.60\temp\imageio8447768555205008617.tmp
大概意識就是:
沒有辦法創建輸出流
沒有辦法創建緩沖檔案
沒有辦法在D:\Program Files\apache\apache-tomcat-8.5.60\temp目錄生成imageio8447768555205008617.tmp檔案
一般碰到 Can't create output stream!的問題就是我們的tomcat下面沒有temp檔案夾,因為ImageIO默認使用的快取目錄是tomcat下面的temp檔案夾,而我有這個檔案夾,但是還沒辦法生成快取檔案,我試了下,是因為我的D盤有權限問題,需要管理員權限才能創建檔案所以沒辦法生成快取檔案,
解決方案
1.在tomcat檔案夾里創建個temp檔案夾
沒有這個檔案夾自然無法存放快取檔案,因為默認的是存放在這個檔案夾,
2.添加ImageIO.setUseCache(false);陳述句
因為ImageIO默認是使用快取目錄,可以通過ImageIO.setUseCache(false)來設定,更改快取策略,不使用檔案目錄快取,使用記憶體快取,
看完如果對你有幫助,感謝點贊支持!
如果你是電腦端,看到右下角的 “一鍵三連” 了嗎,沒錯點它[哈哈]

加油!
共同努力!
Keafmd
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/236639.html
標籤:其他
上一篇:【快速排序】—— [USACO07DEC]Bookshelf B
下一篇:Java中的鎖的分類以及鎖優化
