簡體   English   中英

Vaadin 6 上傳組件:如何終止文件上傳過程而不在服務器上保存錯誤文件

[英]Vaadin 6 Upload component: how to terminate file upload proccess without saving wrong file on a server

在我的應用程序中,我有一個上傳按鈕。 當用戶選擇某個文件時,我必須驗證其擴展名。 (讓用戶只上傳 .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.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.authen認證 nticatorBase.invoke(AuthenticatorBase.java:563) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) .apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293) at 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 at com.vaadin.terminal.gwt.server.AbstractCommunicationManager.streamToReceiver(AbstractCommunicationManager.java:568) ... 17更多的

那么,用錯誤的文件終止上傳的正確方法是什么?

返回一個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 類通過“package com.vaadin.external.org.apache.commons.io.output”打包,因此您應該可以使用該類。

請讓我知道,如果你有任何問題!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM