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

看完如果对你有帮助,感谢点赞支持!
如果你是电脑端,看到右下角的 “一键三连” 了吗,没错点它[哈哈]

在这里插入图片描述
加油!

共同努力!

Keafmd

  • 32
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 28
    评论
uniapp pda是指在uniapp开发中使用PDA设备的情况。根据提供的引用内容,目前uniapp无法直接监听键盘事件,也无法使用5+的api监听键盘事件。在app端使用5+的api也未能成功监听到键盘事件。此外,还需要在manifest.json配置文件中关闭沉浸式,以解决聚焦问题。另外,对于PDA设备的扫码功能,可以使用激光扫码的方式来实现,但需要依赖Android 8以上的版本,并通过广播的方式来监听扫码结果。无论是原生的Android开发方式还是uni-app的跨平台解决方案,都需要在激光扫描模块获取到结果后向系统发出广播,然后通过应用监听广播的方式来获取扫码结果。因此,在uniapp中使用PDA设备需要考虑以上的限制和方案。 #### 引用[.reference_title] - *1* *2* [uniapp 实现PDA设备的扫码功能 超级详细篇](https://blog.csdn.net/Passerby_K/article/details/129527814)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [uni-app在手持PDA上的激光扫码完美解决方案](https://blog.csdn.net/yu1057505847/article/details/121479944)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 28
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

牛哄哄的柯南

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值