Java Vaadin 6上传组件:如何在不将错误文件保存到服务器上的情况下终止文件上传过程
在我的应用程序中,我有一个上传按钮。 当用户选择某个文件时,我必须验证其扩展名。(让用户只上传.txt文件)。若它是txt,则将其保存在服务器上,否则,对该文件不做任何处理 我试过这样的方法: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
//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”打包的,因此您应该可以使用该类
如果您有任何问题,请告诉我