最近使用spring开发的时候,进行统计上传视频的时长,有这么一段代码
但运行的时候吧,发现报错了,
java.lang.ClassCastException: org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile cannot be cast to org.springframework.web.multipart.commons.CommonsMultipartFile
并指向这个图中标记的地方,一翻译原来是类型强制转换错误。
其实项目用了很长时间,但不知为何突然不好使了,估计是最近项目重构,忽略了啥,毕竟这代码一开始也不是我写的。
解决方法:
上面的Encoder是引用了第三方jar包,叫 jave.已上传百度网盘,可以用微信扫一扫
我的项目是springboot项目,直接整jar包路径,然后配置,感觉很不友好,我就将其放在了maven本地仓库。
首先配置maven环境变量,win+R
输入cmd
输入指令 mvn -v
,查看maven信息
找到jar包的下载路径
可以看到直接指向这个目录了,然后开始输入指令
mvn install:install-file -DgroupId=it.sauronsoftware -DartifactId=jave -Dversion=1.0.2 -Dpackaging=jar -Dfile=jave-1.0.2.jar
解释一下:
– DgroupId和DartifactId构成了该jar包在pom.xml的坐标, 对应依赖的DgroupId和DartifactId
– Dfile表示需要上传的jar包的绝对路径
<dependency>
<groupId>it.sauronsoftware</groupId>
<artifactId>jave</artifactId>
<version>1.0.2</version>
</dependency>
然后回车即可
我们去看一下
若是团队开发的话,建议搭建一个私服,可自行查阅资料进行搭建,我后期也会加上此教程。
我公司团队使用的是Sonatype Nexus Repository Manager,界面大概样子
朋友们可自行查阅相关资料。
我们引入包后,还需要在启动类做相关配置
在启动类加一个注解
@SpringBootApplication( exclude = {MultipartAutoConfiguration.class})
并编写一下代码:使其支持强转。
@Bean("multipartResolver")
public CommonsMultipartResolver multipartResolver(){
CommonsMultipartResolver resolver = new CommonsMultipartResolver();
resolver.setDefaultEncoding("UTF-8");
resolver.setMaxInMemorySize(10000);
return resolver;
}
重启项目即可。
补充一下
看下方代码,这是我所使用的的方法,代码只是参考,因需求而异,可进行改动,但核心内容是一样的
public String getVideoTime(HttpServletRequest request, String attributeName) throws Exception {
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
MultipartFile multipartFile = multipartRequest.getFile(attributeName);
if (multipartFile == null || multipartFile.getSize() <1) {
return null;
}
// 将MultipartFile转换为Encoder所需的File
CommonsMultipartFile cf = (CommonsMultipartFile)multipartFile;
DiskFileItem fi = (DiskFileItem) cf.getFileItem();
File source = fi.getStoreLocation();
// 获取视频时长
Encoder encoder = new Encoder();
MultimediaInfo m = encoder.getInfo(source);
long ls = m.getDuration()/1000;
int hour = (int) (ls/3600);
int minute = (int) (ls%3600)/60;
int second = (int) (ls-hour*3600-minute*60);
//logger.info("视频时长为:{}时{}分{}秒", hour, minute, second);
String time = hour+":"+minute+":"+second;
return time;
}