Vaadin 6上传组件:如何在不将错误文件保存在服务器上的情况下终止文件上传过程



在我的应用程序中,我有一个上传按钮。当用户选择某个文件时,我必须验证其扩展名。(只允许用户上传.txt文件)。如果是txt,请将其保存在服务器上,否则,不处理此类文件。

我试过这样的东西:

//Check file type on start event:
@Override
public void uploadStarted(StartedEvent event) {
    String contentType = event.getFilename();
    if (!contentType.endsWith("txt")) {
        isValid = false;
        upload.interruptUpload();
    }
}
//If it is txt, do some actions:
@Override
public OutputStream receiveUpload(String filename, String mimeType) {
    FileOutputStream fos = null;
    if(isValid) {
        try {
            createUserDir(filename);
            fos = new FileOutputStream(file);
            //some more actions
        } catch (final java.io.FileNotFoundException e) {
            log.error(e);
            return null;
        }
    }
    return fos;
}
//Error msg for a user
@Override
public void uploadFailed(Upload.FailedEvent event) {
    root.getWindow().showNotification("Error Header", "Error Msg",
            Window.Notification.TYPE_ERROR_MESSAGE);
}

它几乎可以工作,除了上传组件捕捉到一个错误:

com.vaadin.terminal.gwt.server.UploadException:上载在失败com.vaadin.terminal.gwt.server.AbstractCommunicationManager.streamToReceiver(AbstractCommunicationManager.java:623)在com.vaadin.terminal.gwt.server.AbstractCommunicationManager.doHandleSimpleMultipartFileUpload(AbstractCommunicationManager.java:476)在com.vaadin.terminal.gwt.server.CommunicationManager.handleFileUpload(CommunicationManager.java:259)在com.vaadin.terminal.gwt.server.AbstractApplicationServlet.service(AbstractApplicationServlet.java:495)位于org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)在org.apache.catalina.core.StandardWrapperValv.invoke(StandardWrapperValve.java:233)在org.apache.catalina.core.StandardContextValv.invoke(StandardContextValv.java:191)在org.apache.catalina.authenticator.AuthenticatorBase.ioke(AuthenticatorBase.java:563)在org.apache.catalina.core.StandardHostValv.invoke(StandardHostValve.java:127)在org.apache.catalina.vals.ErrorReportValve.ioke(ErrorReportValve.java:103)在org.apache.catalina.core.StandardEngineValv.invoke(StandardEngineValv.java:109)在org.apache.catalina.connecter.CoyoteAdapter.service(Coyotedapter.java:293)在org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:861)在org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:620)在org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)在java.lang.Thread.run(未知源)由以下原因引起:com.vaadin.terminal.gwt.server.NoOutputStreamException位于com.vaadin.terminal.gwt.server.AbstractCommunicationManager.streamToReceiver(AbstractCommunicationManager.java:568)…还有17个

那么,用错误的文件终止Upload的正确方法是什么呢?

返回一个NullOutputStream(扩展OutputStream)而不是null:

//Check file type on start event:
@Override
public void uploadStarted(StartedEvent event) {
    String contentType = event.getFilename();
    if (!contentType.endsWith("txt")) {
        isValid = false;
        upload.interruptUpload();    
    }
}
//If it is txt, do some actions:
@Override
public OutputStream receiveUpload(String filename, String mimeType) {
    FileOutputStream fos = null; // Stream to write to
    if (filename != null && !filename.isEmpty() && isValid) {
        try {
            createUserDir(filename);
            fos = new FileOutputStream(file);
            return fos;
        } catch (final java.io.FileNotFoundException e) {
            log.error(e);
            return new NullOutputStream();
        }
    } else {/*Show error "Please select a file to upload."*/};
    uploadControl.interruptUpload();
    return new NullOutputStream(); 
}

NullOutputStream类是通过"packagecom.vaadin.external.org.apache.commons.io.output"打包的,因此您应该可以使用该类。

如果你有任何问题,请告诉我!

最新更新