公司的古早java程序,上传视频的时候有50M的限制,结果前端开发新功能,就不行了
必须解开这个限制,首先从链路开始,先到Nginx,放开500M
然后还是报错,看到是后端tomcat的报错
先修改tomcat的xml,放大到500M
<!-- 文件上传 start 配置文件上传,如果没有使用文件上传可以不用配置,当然如果不配,那么配置文件中也不必引入上传组件包 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 默认编码 -->
<property name="defaultEncoding" value="UTF-8"/>
<!-- 文件大小最大值 上传文件大小限制为500M,50*1024*1024 -->
<property name="maxUploadSize" value="524288000"/>
<!-- 内存中的最大值 -->
<property name="maxInMemorySize" value="4096"/>
</bean>
<!--文件上传 end-->
重启tomcat,依然报错!
不过这次不是tomcat报错,而是程序内提示报错,这下拉了,得改代码
程序是2019年的,人早找不到了
完犊子,查查class吧,结果grep到是一个FileUploadRule.class做了限制
只能反编译class再放回去吧
mkdir test
cd test
# 下载反编译jar包
wget https://www.benf.org/other/cfr/cfr-0.152.jar
cp /xxx/FileUploadRule.class .
java -jar cfr-0.152.jar FileUploadRule.class
...
public class FileUploadRule
implements Rule {
public EvaluateResult evaluate(Object file) {
EvaluateResult result = new EvaluateResult();
if (file != null && file instanceof FileEntity) {
FileEntity fe = (FileEntity)file;
if ("UNION".equals(fe.getPlatformId()) && "VIDEO".equals(fe.getSourceEntityType())) {
if (fe.getFileLength() > 0x3200000L) {
result.addViolation("\u89c6\u9891\u6587\u4ef6\u4e0d\u80fd\u5927\u4e8e50M");
}
} else if (fe.getFileLength() > 0xA00000L) {
result.addViolation("\u666e\u901a\u6587\u4ef6\u4e0d\u80fd\u5927\u4e8e10M");
}
}
return result;
}
public boolean suitsFor(Object obj) {
return FileEntity.class.isInstance(obj);
}
}
唉,还得算:
0x3200000L = 0x3200000 换算成十进制:3 * 16^6 + 2 * 16^5 + 0*... 但更简单:0x3200000 = 3*16^6 + 2*16^5 = 3*16777216 + 2*1048576 = 50331648 + 2097152 = 52428800 字节。52428800 字节 = 50 MB (因为 1 MB = 1024*1024 = 1048576, 52428800 / 1048576 = 50)。所以 0x3200000L = 50MB。
0xA00000L = 0xA00000 = 10 * 16^5 = 10 * 1048576 = 10485760 字节 = 10 MB (因为 10485760 / 1048576 = 10)。所以 10MB。
改成500M:
500 MB = 500 × 1024 × 1024 = 524,288,000 字节
524,288,000 转换为十六进制 = 0x1F400000
编译回去,注意jar包和其它都要放在cp路径里
javac -cp "WEB-INF/lib/*:WEB-INF/classes" -d . FileUploadRule.java
最后把class替换回去,重启就解决了。