一波三折之无源码解决网站上传不了视频的问题

warning: 这篇文章距离上次修改已过317天,其中的内容可能已经有所变动。

一波三折之无源码解决网站上传不了视频的问题

一、现象

近日接到求助,一个网站项目后台上传视频文件进度条走完后没任何反应。以为是浏览器兼容性问题,接到请求后亲自换了两个浏览器测试,跟反馈的问题一致。浏览器F12打开开发者选项,跟踪了下视频上传的过程,没发现任何报错信息,倒是看到上传反回了500错误,但没有具体的错误信息。猜测是后台程序问题,于是远程到项目所在服务器上查看。在upload文件夹检查了上传的文件,发现文件上传是正常的,那问题在哪呢?

二、继续排查

从后台的文件及进程架构来看,项目是由java+tomcat构建的。由于没有任何报错信息,决定先看下tocmat日志信息,但是很遗憾,tcomcat里只有普通的info级别的信息,对故障排查作用不大。必须找到配置日志输出级别的文件,将其改为debug才行。java里用的比较多的是日志组件是log4j, 在项目文件夹上搜索log4j,果然找到了log4j.xml。于是将log4j里的输出级别做了调整,==默认是==,修改后如下:

  <Root level="debug">
            <!-- 这里是输入到文件,很重要-->
            <AppenderRef ref="running-log"/>
            <!-- 这里是输入到控制台-->
            <AppenderRef ref="Console"/>
        </Root>

改完重启tomcat后,查看日志,发现日志信息多了起来,但没有看到有用的异常信息。再次尝试上传视频文件,在日志文件里终于看到了错误信息。

image-20230627143759836

从报错信息来看,大概是缺少jar包了吧。可是整个项目运行了那么多年,怎么会突然少了运行库呢?于是问了相关人员,答复是项目交复后,没怎么上传视频,她们也不清楚,晕倒!做运维最怕是遇到这种说不清的事了。

根据以往的经验,少jar包的话,正常编译应该会报错的,除非用到了反射加载jar包。不管了,按报错信息,找来了一个javacv.ar包,丢到项目文件夹\Web-INF\lib里。再次重启tcomcat,报错信息还是没变化。想想应该事情没这么简单,要解决只能先定位哪个地方抛出异常,然后才能深入分析。

三、深入分析

在Web-Info里有个classes文件夹,里面有个com,还有各种controlller以及service、impl等,应该是项目的核心代码了。由于都是编译过的文件,直接打开看不到什么信息,需要反编译,拿出jad神器。

jad.exe -o -r -s java -d src de_com/com/**/**.class  //src是目标路径,后面是编译过的class文件。

找到了代码如下:
image-20230627153559873

image-20230627153357865

看来还是直接import 了 javacv,可能是编译后没把这个包放上去。但是我放了javacv进去也没起作用,项目的pom.xml里也没看到引用的javacv的包。怀疑是版本问题,顺着这个思路走下去,又是一条曲折之路。

四、继续折腾

查了下javacv,这个包很复杂,依赖各种大大小小的包,比如javacpp,opencvffmpeg等。先后更换了javacv1.3,javacv1.5.6。都提示java.lang.NoClassDefFoundError:Could not initialize class org.bytedeco.ffmpeg.global.avutil,java.lang.NoClassDefFoundError:Could not initialize class org.bytedeco.ffmpeg.global.avcodec以及java.lang.classnotfound: org.bytedeco.javacpp.Pointer等,总之死活就报错,无论换什么版本,都像是找不到类或调用类失败。

久攻不下,最终摊牌了,在另一台机上idea新建测试项目,按官方说明pom.xml引用opencv相关库。整个调用getVideoTime复制过去,测试发现调用成功,==说明这样调用其实没什么问题==。

image-20230627155440967

那会不会是java sdk/jre版本的问题呢?毕竟我这测试环境的sdk跟线上的jre版本不同。于是换了几个版本测试,可惜问题依旧。网上关于上述报错,基本上是说jar包版本不匹配,但我这是从官方下载的,怎么不匹配呢,而且测试环境正常。

五、曙光

就这样两天过去了,还是没找到解决方法,那个心情真沮丧:cry:,只能暂时放弃了​!

某天突然想起,会不会是系统环境问题呢? 毕竟线上是windows 2012,测试环境是win7,版本不同,服务器上某些组件可能没开起来。于是远程到服务器上找啊找,opencv这个库应该用到跟显卡或多媒体有关的东西,那么ffmpeg应该也差不多。找了下网上相关说明,再核对server上的配置,果然是没开启Media。于是PowerShell下将它开起来:

Install-WindowsFeature Server-Media-Foundation  

据说也可以如下,没亲测。

image-20230627161409291

重启服务器,再跑我写的demo测试,竟然成功了!然后又打开项目后台,上传视频,也成功了:smile:!

六、后续

这个案例中,主要有两个问题,一是缺少库文件,二是系统缺少相关组件。猜测项目交付后,用户没做过视频上传!解决完视频上传问题后,以为彻底解决了,开开心心的进行了交付,实际还有点手尾,还是下次再说吧,心累!

none
最后修改于:2023年06月27日 23:23

评论已关闭