公司的古早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替换回去,重启就解决了。