使用javax.imageio.ImageIO生成验证码时报错javax.imageio.IIOException: Can't create output stream!

在JEE项目中使用javax.imageio.ImageIO生成验证码,Java代码为:

package com.geeuo.base.controller;

import java.awt.image.BufferedImage;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;
import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import com.google.code.kaptcha.Constants;
import com.google.code.kaptcha.Producer;

/**
 * 生成Captcha验证码
 * 
 * @author Jason
 * @date 2013-12-6 上午10:05:45
 * @version 1.0
 * @since jdk1.5
 */
public class CaptchaImageCreateController extends AbstractController {
	private Producer captchaProducer;

	public void setCaptchaProducer(Producer captchaProducer) {
		this.captchaProducer = captchaProducer;
	}

	@Override
	protected ModelAndView handleRequestInternal(HttpServletRequest request,
			HttpServletResponse response) throws Exception {
		response.setDateHeader("Expires", 0);
		response.setHeader("Cache-Control",
				"no-store, no-cache, must-revalidate");
		response.addHeader("Cache-Control", "post-check=0, pre-check=0");
		response.setHeader("Pragma", "no-cache");
		response.setContentType("image/jpeg");

		String capText = captchaProducer.createText();
		request.getSession().setAttribute(Constants.KAPTCHA_SESSION_KEY,
				capText);
		BufferedImage bi = captchaProducer.createImage(capText);
		ServletOutputStream out = response.getOutputStream();

		ImageIO.write(bi, "jpg", out);
		try {
			out.flush();
		} finally {
			out.close();
		}
		return null;
	}
}

但是在tomcat部署OK后访问登录界面时候验证码图片并未出现,而且后台报如下Exception:

严重: Servlet.service() for servlet springApp threw exception
javax.imageio.IIOException: Can't create output stream!
at javax.imageio.ImageIO.write(ImageIO.java:1566)
at com.geeuo.base.controller.CaptchaImageCreateController.handleRequestInternal(CaptchaImageCreateController.java:46)
at org.springframework.web.servlet.mvc.AbstractController.handleRequest(AbstractController.java:153)
at org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:48)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:875)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:807)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:571)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:501)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at com.geeuo.base.filter.PageAuthFilter.doFilter(PageAuthFilter.java:46)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at com.geeuo.util.http.SetCharacterEncodingFilter.doFilter(Unknown Source:43)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Thread.java:695)
Caused by: javax.imageio.IIOException: Can't create cache file!
at javax.imageio.ImageIO.createImageOutputStream(ImageIO.java:397)
at javax.imageio.ImageIO.write(ImageIO.java:1564)
... 27 more
Caused by: java.io.IOException: No such file or directory
at java.io.UnixFileSystem.createFileExclusively(Native Method)
at java.io.File.checkAndCreate(File.java:1705)
at java.io.File.createTempFile0(File.java:1726)
at java.io.File.access$100(File.java:120)
at java.io.File$1.createTempFile(File.java:1955)
at sun.misc.IOUtils.createTempFile(IOUtils.java:88)
at javax.imageio.stream.FileCacheImageOutputStream.<init>(FileCacheImageOutputStream.java:71)
at com.sun.imageio.spi.OutputStreamImageOutputStreamSpi.createOutputStreamInstance(OutputStreamImageOutputStreamSpi.java:50)
at javax.imageio.ImageIO.createImageOutputStream(ImageIO.java:393)
... 28 more

经过google后发现是tomcat根目录缺少temp文件夹,创建后,一切OK!



### 可能的原因分析 `javax.imageio.IIOException: Can't read input file!` 是 Java 中常见的异常之一,通常发生在尝试通过 `ImageIO.read()` 方法加载图像文件失败的情况下。这种问题可能由多种原因引起: 1. **文件路径不正确**:如果指定的文件路径不存在或者指向了一个无效的位置,则会抛出此异常[^5]。 2. **权限不足**:即使文件存在,但如果程序运行没有足够的权限访问该文件也会引发同样的错误[^4]。 3. **文件损坏或格式不受支持**:目标文件可能是损坏的或者是 ImageIO 不支持的某种特殊格式[^1]。 ### 解决方案 #### 验证并修正文件路径 确认所提供的文件路径绝对无误非常重要。如果是相对路径,需确保它相对于当前工作目录是有效的。可以通过打印 `System.getProperty("user.dir")` 来查看应用程序启动的工作目录位置,并据此调整路径设置。 ```java String currentDir = System.getProperty("user.dir"); System.out.println("Current working directory is " + currentDir); ``` #### 检查文件是否存在以及可读性 在调用 `ImageIO.read(File)` 前先验证 File 对象表示的实际资源确实可用且具有读取权限。 ```java File imageFile = new File("/path/to/your/image.jpg"); if (!imageFile.exists()) { throw new FileNotFoundException("The specified image does not exist."); } if (!imageFile.canRead()) { throw new SecurityException("You do not have permission to read the specified image."); } ``` 上述代码片段可以帮助识别因缺失或不可达而导致的问题。 #### 使用合适的图像处理库 虽然标准 JDK 提供了基本功能来操作常见类型的图形文件,但对于某些特定格式的支持有限。遇到这种情况可以考虑引入第三方类库比如 Apache Commons Imaging 或者 Thumbnailator 这些更强大的工具集作为替代解决方案。 另外,在实际开发过程中还应该注意捕获潜在的 I/O 错误以便更好地调试和维护应用逻辑[^3]: ```java try { BufferedImage img = ImageIO.read(new File("/path/to/file")); } catch (IIOException e) { logger.error("Failed to load image due to an IO issue.", e); } catch (IllegalArgumentException ex){ logger.warn("Invalid argument supplied when attempting to open image resource",ex ); } finally{ // Cleanup resources here if necessary. } ``` 以上方法能够有效减少此类异常的发生概率同提高系统的健壮性和用户体验满意度。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值