【发布时间】:2014-05-22 12:42:29
【问题描述】:
我需要做非常基本的文件上传操作,但在我的情况下,文件上传拦截器不会调用 setter 方法。
我已经在 stackoverflow 上检查了类似问题 like this 的解决方案,但它们没有解决我的问题。
请告诉我我在代码中犯了什么错误。
动作类
public class ResultFileUploadAction extends ActionSupport {
private File upload;
private String uploadFileName;
private String uploadContentType;
private Logger logger = Logger.getRootLogger();
@Override
public String execute() throws Exception {
logger.info("ResultFileUploadAction->execute");
String destPath = "C:/work/";
try {
System.out.println("Src File name: " + upload);
System.out.println("Dst File name: " + uploadFileName);
File destFile = new File(destPath, uploadFileName);
FileUtils.copyFile(upload, destFile);
} catch (IOException e) {
e.printStackTrace();
return ERROR;
}
return super.execute();
}
public void setUpload(File upload) {
this.upload = upload;
}
public void setUploadContentType(String uploadContentType) {
this.uploadContentType = uploadContentType;
}
public void setUploadFileName(String uploadFileName) {
this.uploadFileName = uploadFileName;
}
}
Jsp 文件
<body>
<s:form action="upload" method="post" enctype="multipart/form-data">
<input type="file" name="upload" id="uploadfile" />
<input type="submit" id="submit" />
</s:form>
</body>
Struts.xml
<interceptors>
<interceptor name="fileupload"
class="org.apache.struts2.interceptor.FileUploadInterceptor"></interceptor>
<interceptor name="servletConfig"
class="org.apache.struts2.interceptor.ServletConfigInterceptor" />
<interceptor name="authenticationinterceptor"
class="interceptors.common.AuthenticationInterceptor"></interceptor>
<interceptor-stack name="securestack">
<interceptor-ref name="authenticationinterceptor"></interceptor-ref>
<interceptor-ref name="servletConfig"></interceptor-ref>
</interceptor-stack>
</interceptors>
<action name="upload" class="actions.result.ResultFileUploadAction"
method="execute">
<interceptor-ref name="securestack"></interceptor-ref>
<interceptor-ref name="fileupload"></interceptor-ref>
<result name="success" type="dispatcher">/AddResultBullk.jsp</result>
</action>
由于没有调用 setter,因此我在 execute() 中得到了 NPE。
【问题讨论】:
-
AFAIK 如果没有常规参数拦截器,这将无法工作。通过剥离几乎所有框架的默认拦截器,您冒着消除很多功能的风险——一般来说,我不建议这样做。请使用更完整的拦截器堆栈仔细检查。
-
@DaveNewton 你是对的,fileupload 与 defaultstack 一起工作,但是 javadoc 中没有提到这个拦截器必须与默认堆栈中的一些(不知道是哪一个)拦截器一起使用。至少应该有一个注释。
-
文件上传文档指出拦截器“添加参数”,这对我来说意味着它需要 params 拦截器。
-
不使用拦截器上传,不起作用。还有stackoverflow.com/a/20071814/573032
标签: java file-upload struts2