Struts 2文件上传给出NULL指针

时间:2014-12-03 11:10:29

标签: java java-ee struts2 struts

我正在尝试使用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&hellip; <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&hellip; <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)

2 个答案:

答案 0 :(得分:2)

HTML提交方法应为"post",而不是"get"。见http://www.w3.org/TR/html401/interact/forms.html#h-17.13.1

答案 1 :(得分:1)

你做了很多奇怪的事情。

  1. 使用POST方法,因为你需要一个正文(并且你没有执行幂等操作...... GET = read,POST = write,基本上,虽然它们通常可以反过来使用);

  2. 使用defaultStack,或定义您的堆栈;

  3. 与File一起,您应该为contentyType和filename定义两个字符串;

  4. 您可以从单个<input type="file" />元素中upload multiple files easy with the multiple attribute;

  5. 但即使您想使用多个元素,您仍然可以将文件发布到List而不是发布到不同的文件对象。如果明天你需要上传10个文件怎么办?还是100?您需要每次都来这里,更改代码并释放它。

  6. 请勿在{{1​​}}块中退回SUCCESS,甚至不要在catch添加错误。