在登录界面生成验证码的时候,控制台可以显示生成的验证码,但是在客户端登录界面不显示图片。
报错javax.imageio.IIOException: Can't create output stream!
具体如下:
HTTP Status 500 – Internal Server Error
Type Exception Report
Message Can't create output stream!
Description The server encountered an unexpected condition that prevented it from fulfilling the request.
Exception
javax.imageio.IIOException: Can't create output stream!
javax.imageio.ImageIO.write(ImageIO.java:1574)
com.hhit.servlet.CheckCodeServlet.doGet(CheckCodeServlet.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:624)
javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
Root Cause
javax.imageio.IIOException: Can't create cache file!
javax.imageio.ImageIO.createImageOutputStream(ImageIO.java:423)
javax.imageio.ImageIO.write(ImageIO.java:1572)
com.hhit.servlet.CheckCodeServlet.doGet(CheckCodeServlet.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:624)
javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
Root Cause
java.nio.file.AccessDeniedException: C:\Program Files (x86)\apache-tomcat-7.0.94\temp\imageio7316901718607827838.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.hhit.servlet.CheckCodeServlet.doGet(CheckCodeServlet.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:624)
javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
Note The full stack trace of the root cause is available in the server logs.
Apache Tomcat/7.0.94
原因:
百度找到原因,生成图片的时候要用到io流,会读取变量java.io.tmpdir!如果没有自定义路径,默认读取路径是tomcat下的temp文件夹。
当temp文件夹不存在时,就会出现”Can’t create output stream”。图片生成失败,无法正常显示。
只需要在Tomcat下创建temp文件夹即可。
解决方法
查看后发现我的Tomcat下存在temp文件夹。
便尝试删除temp文件夹。
运行成功、图片正常显示。
疑惑
再次查看Tomcat目录,发现Tomcat并没有自动生成temp文件夹。
根据原理,应当不存在temp才会出错。
然而默认读取目录temp存在时反而出错,删除temp文件夹反而正确。
手动创建temp文件夹后,运行图片再次无法显示
我的开发工具是idea存在此问题,相同项目、Tomcat在eclipse正常。应该与idea、eclipse对JavaWEB项目部署方式有关。