使用 ProgressListener 上传 Commons 文件获得的字节数超过文件实际大小
Commons file upload with ProgressListener gets more bytes than file actual size
当我使用 apache commons-fileupload 上传文件时,它工作正常。
但是当我添加一个 ProgressListener 来监控上传进度时,pBytesRead 比 pContentLength 当文件是压缩文件时,比如 .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不一样
当我使用 apache commons-fileupload 上传文件时,它工作正常。 但是当我添加一个 ProgressListener 来监控上传进度时,pBytesRead 比 pContentLength 当文件是压缩文件时,比如 .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不一样