javax.imageio.IIOException: Can‘t create output stream!(验证码图片不显示)

简介: 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)来设置,更改缓存策略,不使用文件目录缓存,使用内存缓存。

相关文章
|
3月前
|
存储 缓存 测试技术
开发文档的模版(参考)
本文档为[模块名称]的开发文档,详细介绍了系统模块的数据库表结构设计、接口定义、关键设计方案及外部API集成等内容,涵盖了核心表、从表、废弃表的设计规范,以及接口请求方式、参数说明、响应格式和异常处理机制。
262 0
|
机器学习/深度学习 缓存 Java
javax异常: javax.imageio.IIOException: Can't create output stream解决方法
javax异常: javax.imageio.IIOException: Can't create output stream解决方法
|
JSON 数据格式
jackson使用@JsonSerialize格式化BigDecimal解决.00不显示问题
jackson使用@JsonSerialize格式化BigDecimal解决.00不显示问题
1096 0
|
Ubuntu Linux Shell
Ubuntu/linux系统环境变量配置详解
理解和掌握如何配置环境变量对于使用和管理Ubuntu/Linux系统非常重要。
540 2
|
人工智能 芯片
合肥中科深谷嵌入式项目实战——人工智能与机械臂(一)
合肥中科深谷嵌入式项目实战——人工智能与机械臂(一)
|
Java 开发者 Spring
Spring项目中Ordered接口的应用:全局过滤器(GlobalFilter)的顺序控制
Spring项目中Ordered接口的应用:全局过滤器(GlobalFilter)的顺序控制
586 2
|
负载均衡 算法 网络协议
【专栏】网络高可用性和负载均衡关键在于VRRP、VGMP和HRP协议
【4月更文挑战第28天】网络高可用性和负载均衡关键在于VRRP、VGMP和HRP协议。VRRP实现路由器冗余,保证流量转发;VGMP优化多播流量传输,适合多媒体服务;HRP提供无缝故障转移,适用于电信级网络。选择需考虑网络环境和业务需求,VRRP简单易部署,VGMP处理多播流量,HRP适合高稳定性场景。理解协议特点,确保网络最佳性能和可用性。
595 4
|
数据采集 网络协议 API
Python网络编程库介绍
【4月更文挑战第3天】Python的网络编程库包括socket、requests、urllib、paramiko、Twisted和asyncio。socket提供底层套接字编程,requests简化HTTP请求,urllib处理简单HTTP任务。paramiko支持SSHv2协议,适用于远程管理。Twisted是事件驱动的网络引擎,适合高性能应用。asyncio是Python 3.4+的异步IO库,用于编写并发代码。开发者应根据需求选择合适的库,考虑版本兼容性、文档和社区支持。
|
缓存 Linux API
Linux V4l2视频设备
Linux V4l2视频设备
|
JavaScript
vue自定义指令directives同时传递多个参数
vue自定义指令directives同时传递多个参数
482 0
vue自定义指令directives同时传递多个参数