使用 ProgressListener 上传 Commons 文件获得的字节数超过文件实际大小

Commons file upload with ProgressListener gets more bytes than file actual size

当我使用 apache commons-fileupload 上传文件时,它工作正常。 但是当我添加一个 ProgressListener 来监控上传进度时,pBytesReadpContentLength 当文件是压缩文件时,比如 .zip 文件或 .7z 文件,如果我将 zip 文件解压缩为常规文件,它可以完美运行。

这是我的 ProgressListener:

package com.qzing.ieep.file.api.listener;

import java.math.BigDecimal;
import java.math.RoundingMode;

import org.apache.commons.fileupload.ProgressListener;
import org.springframework.stereotype.Component;

@Component
public class FileUploadProgressListener implements ProgressListener {

    public void update(long pBytesRead, long pContentLength, int pItems) {
        System.out.println(pBytesRead + "/" + pContentLength);
        BigDecimal percent = new BigDecimal(pBytesRead).divide(new BigDecimal(pContentLength), 2, RoundingMode.DOWN)
                .multiply(new BigDecimal("100"));
        if(percent.compareTo(new BigDecimal("100")) == 0) {
            System.out.println("Upload complete.");
        }
    }

}

当我上传 zip 文件时,输出:

1024/16494814
2048/16494814
...
16494814/16494814
Upload complete.
16495838/16494814
16495962/16494814
...
29866392/16494814
29870434/16494814
29873819/16494814

pBytesRead大于pContentLength,百分比始终在182左右。

当我上传 .sql 文件时,输出:

1024/16494814
2048/16494814
...
16493790/16494814
16494814/16494814
Upload complete.

知道为什么会这样吗?

我解决了。原来是我自己的问题,我加了一个RequestWrapper来缓存request body用于logging等,MultipartRequest也转成String来缓存,String的长度和原来的reqeust body不一样