图片上传突然出现有时会上传失败的情况,一顿查找因为上传文件的接口返回了500状态码,由于接口提供方人员问题(懒散惯了,无组织无纪律,跨部门没办法。。),没有认真查找自己服务器日志,往别的地方扯,这就非常被动,但是问题原因我们是一定要查到的:
查找定位原因步骤如下:
1.首先尝试用上传失败的那些图片重新上传,发现上传成功,并没有复现出问题时的场景;
2.通过用户端日志发现有后缀为.heic格式的图片,尝试找到格式为.heic的图片通过postman模拟上传图片(跳过客户端,绕过客户端针对不同文件格式的处理,直接与依赖方接口交互);
3.postman上传jpg/png/gif均能够正常上传;
4.postman上传heic文件必现500响应;
报错信息如下:
<p><b>Message</b> Handler processing failed; nested exception is java.lang.NoClassDefFoundError:
org/apache/oro/text/perl/Perl5Util</p>
<p><b>Description</b> The server encountered an unexpected condition that prevented it from fulfilling the request.
</p>
<p><b>Exception</b>
<pre>org.springframework.web.util.NestedServletException: Handler processing failed; nested exception is java.lang.NoClassDefFoundError: org/apache/oro/text/perl/Perl5Util
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:972)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)
org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789)
javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
org.tuckey.web.filters.urlrewrite.NormalRewrittenUrl.doRewrite(NormalRewrittenUrl.java:195)
org.tuckey.web.filters.urlrewrite.RuleChain.handleRewrite(RuleChain.java:159)
org.tuckey.web.filters.urlrewrite.RuleChain.doRules(RuleChain.java:141)
org.tuckey.web.filters.urlrewrite.UrlRewriter.processRequest(UrlRewriter.java:90)
org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:417)
org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
</pre>
</p>
<p><b>Root Cause</b>
<pre>java.lang.NoClassDefFoundError: org/apache/oro/text/perl/Perl5Util
net.sf.jmimemagic.MagicMatcher.testRegex(MagicMatcher.java:659)
net.sf.jmimemagic.MagicMatcher.testInternal(MagicMatcher.java:433)
net.sf.jmimemagic.MagicMatcher.test(MagicMatcher.java:237)
net.sf.jmimemagic.Magic.getMagicMatch(Magic.java:344)
net.sf.jmimemagic.Magic.getMagicMatch(Magic.java:240)
sun.reflect.GeneratedMethodAccessor42.invoke(Unknown Source)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:498)
org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:213)
org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:126)
org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:96)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:617)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:578)
org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:923)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)
org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789)
javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
org.tuckey.web.filters.urlrewrite.NormalRewrittenUrl.doRewrite(NormalRewrittenUrl.java:195)
org.tuckey.web.filters.urlrewrite.RuleChain.handleRewrite(RuleChain.java:159)
org.tuckey.web.filters.urlrewrite.RuleChain.doRules(RuleChain.java:141)
org.tuckey.web.filters.urlrewrite.UrlRewriter.processRequest(UrlRewriter.java:90)
org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:417)
org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
问题原因已经清晰明了:Handler processing failed; nested exception is java.lang.NoClassDefFoundError: org/apache/oro/text/perl/Perl5Util;;
解决办法可以google,就是缺少类;
反馈给接口负责人,修复上线;
总结:作为一个技术人,要有实事求是的心态才能成长,不尝试排查问题解决问题,永远担不起重任