我正在使用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());
}

07-24 09:19