我正在使用wicket将大型(〜2Gb +)zip文件提交到Web应用程序,以处理zip文件,而我正在使用java.util.zip。*类,并且我需要能够从压缩文件。所以我的代码是这样的:
class MyForm extends Form {
private FileUploadField fileField;
MyForm(String id) {
super(id);
fileField = new FileUploadField("upload");
add(fileField);
}
@Override
protected void onSubmit() {
FileUpload fileUpload = fileField.getFileUpload();
File file = fileUpload.writeToTempFile();
ZipFile zipFile = new ZipFile(file);
// Do more stuff
}
}
由于上传文件很大,检票口在解析请求时将其放入一个临时文件中,但是writeToTempFile()将其复制到另一个临时文件中,因此我现在在磁盘上有文件的两个副本。这浪费了磁盘空间,磁盘IO并增加了请求处理时间。
我无法使用ZipFileInputStream,因为我需要以随机顺序访问文件。有没有办法停止检票口复制磁盘上的文件?
最佳答案
是的,但这不是一个好方法。
您可以继承FileUploadField
的子类,并使用暴露基础getFileUpload()
的副本覆盖FileItem
方法。
或者,另一种方法是在FileUploadField
子类中创建一个新方法,仅返回FileItem
:
public FileItem getFileItem() {
return ((IMultipartWebRequest)getRequest()).getFile(getInputName());
}