javax.imageio.IIOException: Can't create output stream!(验证码图片不显示)
问题
今天遇到个很怪的问题,在机房电脑运行代码时,验证码图片可以生成,回来在自己的电脑运行就不可以了,验证码图片加载不出现,单独访问生成验证码的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