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

Java Vaadin 6上传组件:如何在不将错误文件保存到服务器上的情况下终止文件上传过程,java,vaadin,vaadin6,Java,Vaadin,Vaadin6,在我的应用程序中,我有一个上传按钮。 当用户选择某个文件时,我必须验证其扩展名。(让用户只上传.txt文件)。若它是txt,则将其保存在服务器上,否则,对该文件不做任何处理 我试过这样的方法: //Check file type on start event: @Override public void uploadStarted(StartedEvent event) { String contentType = event.getFilename(); if (!conten

在我的应用程序中,我有一个上传按钮。 当用户选择某个文件时,我必须验证其扩展名。(让用户只上传.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);
}
它几乎可以正常工作,但upload组件捕捉到一个错误:

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) 位于javax.servlet.http.HttpServlet.service(HttpServlet.java:723) org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 在 org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:563) 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) 在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.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个


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

返回一个
NullOutputStream
(它)而不是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类是通过“package com.vaadin.external.org.apache.commons.io.output”打包的,因此您应该可以使用该类

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