java - 上传文件时出现 NullPointerException

标签 java file-upload struts2 struts2-interceptors

上传文件时,出现以下错误:

Struts Problem Report Struts has detected an unhandled exception: Messages: File: java/io/File.java Line number: 317 
Stacktraces java.lang.NullPointerException java.io.File.(File.java:317) 
    example.uploadFile.execute(uploadFile.java:36) 
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.jav‌​a:43)
    java.lang.reflect.Method.invoke(Method.java:483)

index.jsp

<form action="upload" method="post" enctype="multipart/form-data">
    <label for="myFile">Upload your file</label>
    <input type="file" name="myFile" />
    <input type="submit" value="Upload"/>
</form>

上传文件.java

package example;
import java.io.File;
import org.apache.commons.io.FileUtils;
import java.io.IOException;    
import com.opensymphony.xwork2.ActionSupport;

public class uploadFile extends ActionSupport {
   private File myFile;
   private String myFileContentType;
   private String myFileFileName;
   private String destPath;

   public String execute() {

      destPath = "C:\\Program Files\\Apache Software Foundation\\Apache Tomcat 8.0.3\\work";

      try{
         System.out.println("Src File name: " + myFile);
         System.out.println("Dst File name: " + myFileFileName);                     
         File destFile  = new File(destPath, myFileFileName);
         FileUtils.copyFile(myFile, destFile);      
      }catch(IOException e){
         return ERROR;
      }

      return SUCCESS;
   }

   public File getMyFile() {
      return myFile;`
   }
   public void setMyFile(File myFile) {
      this.myFile = myFile; this the file which user selects to upload
   }
   public String getMyFileContentType() {
      return myFileContentType; content type of the uploading file
   }
   public void setMyFileContentType(String myFileContentType) {
      this.myFileContentType = myFileContentType;`
   }
   public String getMyFileFileName() {
      return myFileFileName;
   }
   public void setMyFileFileName(String myFileFileName) {
      this.myFileFileName = myFileFileName; 
   }
}

struts.xml

<struts>
    <include file="example.xml"/>
    <constant name="struts.devMode" value="true" />
    <constant name="struts.multipart.maxSize" value="1000000" />

    <!-- Configuration for the default package. -->
    <package name="default" extends="struts-default">
       <action name="upload" class="example.uploadFile">
            <interceptor-ref name="basicStack"/>
            <interceptor-ref name="fileUpload">
                <param name="allowedTypes">image/jpeg,image/gif</param>
            </interceptor-ref>
            <result name="success">/success.jsp</result>
            <result name="error">/error.jsp</result>
        </action>
    </package>
</struts>

最佳答案

为了正常工作,FileUpload拦截器必须在basicStack中的其他拦截器之前运行;

您可以在 struts-default.xml 中查看。 :

示例1:

<!-- Sample file upload stack -->
<interceptor-stack name="fileUploadStack">
    <interceptor-ref name="fileUpload"/>
    <interceptor-ref name="basicStack"/>
</interceptor-stack>

示例 2:

<interceptor-stack name="defaultStack">
    <interceptor-ref name="exception"/>
    <interceptor-ref name="alias"/>
    <interceptor-ref name="servletConfig"/>
    <interceptor-ref name="i18n"/>
    <interceptor-ref name="prepare"/>
    <interceptor-ref name="chain"/>
    <interceptor-ref name="scopedModelDriven"/>
    <interceptor-ref name="modelDriven"/>
    <interceptor-ref name="fileUpload"/>
    <interceptor-ref name="checkbox"/>
    <interceptor-ref name="datetime"/>
    <interceptor-ref name="multiselect"/>
    <interceptor-ref name="staticParams"/>
    <interceptor-ref name="actionMappingParams"/>
    <interceptor-ref name="params">
        <param name="excludeParams">^action:.*,^method:.*</param>
    </interceptor-ref>
    <interceptor-ref name="conversionError"/>
    <interceptor-ref name="validation">
        <param name="excludeMethods">input,back,cancel,browse</param>
    </interceptor-ref>
    <interceptor-ref name="workflow">
        <param name="excludeMethods">input,back,cancel,browse</param>
    </interceptor-ref>
    <interceptor-ref name="debugging"/>
    <interceptor-ref name="deprecation"/>
</interceptor-stack>

然后手动将其放置在 basicStack 声明之前,或使用堆栈(defaultStackfileUploadStack)并包含拦截器的名称参数名称之前,例如:

<interceptor-ref name="defaultStack">
    <param name="fileUpload.allowedTypes">image/jpeg,image/gif</param>
</interceptor-ref>

<interceptor-ref name="fileUploadStack">
    <param name="fileUpload.allowedTypes">image/jpeg,image/gif</param>
</interceptor-ref>

关于java - 上传文件时出现 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29210254/

相关文章:

java - numberFormatException 编译错误

java - com.mysql.jdbc.exceptions.jdbc4.CommunicationsException : Communications link failure - Caused by: java.net.UnknownHostException: null: 未知错误

java - 不允许加载本地资源: Why?

java - 如何在 JSF 应用程序中获取部署目录路径?

java - 在 roo 项目中使用 javax.persistence.Table @Table 注释,如何使用 maven(或 spring)从构建配置文件中设置架构?

file-upload - 带相机的移动 Safari 多次上传

java - 使用 <s :doubleselect> 时的 Struts 2 HTML 问题

java - 在 Struts2 中验证整数值?

java - 通过 <s :url/> Struts2 tag 传递多个参数

java - jsf中图片上传出现NullPointer异常