【问题标题】:Vaadin 6 Upload component: how to terminate file upload proccess without saving wrong file on a serverVaadin 6 Upload 组件:如何终止文件上传过程而不在服务器上保存错误文件
【发布时间】:2016-04-29 07:27:56
【问题描述】:

在我的应用程序中,我有一个上传按钮。 当用户选择某个文件时,我必须验证其扩展名。 (让用户只上传 .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) 在 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(Unknown Source) 引起: com.vaadin.terminal.gwt.server.NoOutputStreamException 在 com.vaadin.terminal.gwt.server.AbstractCommunicationManager.streamToReceiver(AbstractCommunicationManager.java:568) ... 17 更多

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

【问题讨论】:

    标签: java vaadin vaadin6


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2016-01-30
      • 1970-01-01
      • 2012-06-06
      • 1970-01-01
      • 2016-05-21
      • 2015-01-21
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      相关资源
      最近更新 更多