解决 异常 : javax.imageio.IIOException : 출력 스트림을 만들 수 없습니다

문제 설명:

오늘 갑자기 시스템 로그인 페이지의 인증 코드가 표시되지 않는 것을 발견하고 백그라운드 로그 정보를 확인한 결과 로그가 출력되지 않는 것을 발견했습니다. 로그에 디스크가 꽉 찬 것 같고 바람둥이 로그를 삭제했습니다. 다시 시작하면 비정상적인 메시지가 출력됩니다. :

javax.imageio.IIOException : 출력 스트림을 만들 수 없습니다!
javax.imageio.ImageIO.write (ImageIO.java:1574)
at cn.dreamit.p1001.verifycode.util.VerifyCodeUtils.outputImage (VerifyCodeUtils.java:184)
at cn.dreamit.p1001.verifycode.controller.VerifyCodeController.generateVerifyCode (VerifyCodeController.java:74)
at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
at
org.springframework.web.method.support.InvocableHandlerMethod.doInvoke (InvocableHandlerMethod.java:205)의 java.lang.reflect.Method.invoke (Method.java:498 )
org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest (InvocableHandlerMethod.java:133)에서
org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle (ServletInvocableHandlerMethod.java:97)에서
org.springframework에서 .web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod (RequestMappingHandlerAdapter.java:827)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal (RequestMappingHandlerAdapter.java:738)에서
org.springframework에서
org.springframework.web.servlet.DispatcherServlet.doDispatch (DispatcherServlet.java:967)의 .web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle (AbstractHandlerMethodAdapter.java:85 )
org.springframework.web.servlet.DispatcherServlet.doService (DispatcherServlet.java:901)
org.springframework.web.servlet.FrameworkServlet.processRequest (FrameworkServlet.java:970)
at org.springframework.web.servlet.FrameworkServlet.doGet (FrameworkServlet.java:861)
at javax.servlet.http.HttpServlet.service (HttpServlet.java:626)
at org.springframework.web.servlet.FrameworkServlet.service (FrameworkServlet.java:846)
at javax.servlet.http.
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter (ApplicationFilterChain.java:231)의 HttpServlet.service (HttpServlet.java:733)
org.apache.catalina.core.ApplicationFilterChain.doFilter (ApplicationFilterChain.java:166)
org.apache.tomcat.websocket.server.WsFilter.doFilter (WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter (ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain .doFilter (ApplicationFilterChain.java:166)
at cn.dreamit.dreamweb.websso.filter.AbstactSsoFilter.doFilter (AbstactSsoFilter.java:122)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter (ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter (ApplicationFilterChain.java:166)


코드 분석 :

문제 코드는 주로 다음 줄입니다.

ImageIO.write (이미지,“jpg”, os);

그림을 출력하는 코드는 기본적으로 기본 설정입니다. 기본 스트림 출력 디렉토리는 / tomcat / temp입니다.이 디렉토리를 찾아서 아무것도 찾지 못했지만 최상위 디렉토리를 추적하고 다른 프로젝트의 로그 파일을 살펴 보았습니다. 디스크가 꽉 찼습니다. 지금까지 문제가 발견되었습니다.


해결책:

1. Tomcat에 임시 디렉토리가 있는지 확인하십시오. ImageIO.write () 문장은 기본적으로 tomcat 아래의 임시 디렉토리에 출력되기 때문입니다.

2. ImageIO.setCacheDirectory (cacheDirectory), 캐시 출력 디렉터리로 충분한 공간이있는 다른 디렉터리를 설정합니다.

3. ImageIO는 기본적으로 캐시 디렉터리를 사용합니다. ImageIO.setUseCache (false)로 설정하여 파일 디렉터리 캐시를 사용하지 않고 메모리 캐시를 사용하여 캐시 전략을 변경할 수 있습니다.

4. ImageIO를 사용하지 말고 다른 JDK 메소드로 변경하십시오.
ImageIO.write (bi,“jpg”, baos);

例如 :
JPEGImageEncoder imageEncoder = JPEGCodec.createJPEGEncoder (response.getOutputStream ());
imageEncoder .encode (이미지);

추천

출처blog.csdn.net/datuanyuan/article/details/109033300