我正在尝试使用struts2上传2个文件......但是当我在FileInputStream中打开文件时,我得到一个NullPointerException,因为文件值被指定为Null。
Upload.html
<form action="report.action" method="get" enctype="multipart/form-data">
<div class="form-group input-group">
<div class="input-group">
<span class="input-group-btn">
<span class="btn btn-primary btn-file">Browse… <input type="file" name="file1"></span></span>
<input type="text" class="form-control" readonly placeholder="Amdocs Report">
</div>
</div>
<div class="form-group input-group">
<div class="input-group">
<span class="input-group-btn">
<span class="btn btn-primary btn-file">Browse… <input type="file" name="file2"></span></span>
<input type="text" class="form-control" readonly placeholder="ILC Report">
</div>
行动类
private File file1;
private File file2;
public File getFile1() {
return file1;
}
public void setFile1(File file1) {
this.file1 = file1;
}
public File getFile2() {
return file2;
}
public void setFile2(File file2) {
this.file2 = file2;
}
public String execute() {
try {
FileInputStream file= new FileInputStream(file1);
System.out.println(file1);
System.out.println(file2);
generate(file1,file2);
return "success";
}catch(Exception ex) {
ex.printStackTrace();
return "success";
}
}
struts.xml中
<struts>
<package name="default" extends="struts-default">
<action name="report" class="com.o2.report.GenerateReport">
<interceptor-ref name="fileUpload"/>
<interceptor-ref name="basicStack"/>
<result name="success">index.html</result>
</action>
</package>
当我在调试模式下看到时,我将file1和file2的值设置为null。
错误
[3/12/14 16:30:45:994 IST] 0000001d SystemErr R java.lang.NullPointerException
[3/12/14 16:30:45:995 IST] 0000001d SystemErr R at java.io.FileInputStream.<init>(FileInputStream.java:109)
[3/12/14 16:30:45:995 IST] 0000001d SystemErr R at com.o2.report.GenerateReport.execute(GenerateReport.java:39)
[3/12/14 16:30:45:995 IST] 0000001d SystemErr R at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[3/12/14 16:30:45:995 IST] 0000001d SystemErr R at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:45)
[3/12/14 16:30:45:995 IST] 0000001d SystemErr R at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)
[3/12/14 16:30:45:995 IST] 0000001d SystemErr R at java.lang.reflect.Method.invoke(Method.java:599)
[3/12/14 16:30:45:996 IST] 0000001d SystemErr R at com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:450)
[3/12/14 16:30:45:996 IST] 0000001d SystemErr R at com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:289)
[3/12/14 16:30:45:996 IST] 0000001d SystemErr R at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:252)
[3/12/14 16:30:45:996 IST] 0000001d SystemErr R at com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:167)
答案 0 :(得分:2)
HTML提交方法应为"post"
,而不是"get"
。见http://www.w3.org/TR/html401/interact/forms.html#h-17.13.1
答案 1 :(得分:1)
你做了很多奇怪的事情。
使用POST
方法,因为你需要一个正文(并且你没有执行幂等操作...... GET = read,POST = write,基本上,虽然它们通常可以反过来使用);
使用defaultStack,或定义您的堆栈;
与File一起,您应该为contentyType和filename定义两个字符串;
您可以从单个<input type="file" />
元素中upload multiple files easy with the multiple attribute;
但即使您想使用多个元素,您仍然可以将文件发布到List而不是发布到不同的文件对象。如果明天你需要上传10个文件怎么办?还是100?您需要每次都来这里,更改代码并释放它。
请勿在{{1}}块中退回SUCCESS
,甚至不要在catch
添加错误。