2013-12-22 34 views
1

我想使用Struts 2文件上傳,但在我看來,它不工作。以下是我的代碼。Struts 2文件上傳:文件對象爲空

UploadAction.java

public class UploadAction extends ActionSupport{ 

    private File file; 
    private String orgFileName; 
    private String orgContentType; 

    public void setUpload(File file){ 
     this.file=file; 
    } 

    public void setUploadContentType(String contentType){ 
     this.orgContentType=contentType; 
    } 
    public void setUploadFileName(String fileName){ 
     this.orgFileName=fileName; 
    } 

    @Override 
    public String execute(){ 
     if(file==null) 
     { 
      System.out.println("No file...."); 
     } 
     System.out.println(orgContentType); 
     System.out.println(orgFileName); 
     return SUCCESS; 
    } 


} 

struts.xml

<constant name="struts.multipart.maxSize" value="20971520" /> 
    <constant name="struts2.multipart.saveDir" value="C:/users/sabertooth/desktop/upload" /> 
    <include file="example.xml"/> 

    <!-- Configuration for the default package. --> 
    <package name="default" extends="struts-default"> 
     <action name="upload" class="UploadAction"> 

      <result name="success">/example/HelloWorld.jsp</result> 
     </action> 
    </package> 

我也想設置struts2.multipart.saveDir屬性,你可以在上面看到,但是當我看到服務器日誌我看到這條線

unable to find `struts.multipart.saveDir` defaulting to `javax.servlet.dir` 

此外,文件對象爲空,因爲沒有文件.. 。在控制檯上打印出來。 我無法弄清楚這裏有什麼問題。

編輯:

fileupload.jsp

<%@page contentType="text/html" pageEncoding="UTF-8"%> 
<%@ taglib prefix="s" uri="/struts-tags" %> 
<!DOCTYPE html> 
<html> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
     <title>JSP Page</title> 
    </head> 
    <body> 
     <h1>upload file below</h1> 
     <s:form action="upload" method="post" enctype="multipart/form-data"> 
      <input type="file" name="file" id="uploadfile" /> 
      <input type="submit" id="submit" /> 
     </s:form> 

    </body> 
</html> 
+0

哪裏是調用這個類的代碼?似乎「文件」沒有正確發送到setUpload(File file)方法中。這可能是你收到消息說對象爲空的原因。 – DerStrom8

+0

@ derstrom8查看編輯我更新了fileupload.jsp的代碼 UploadAction是映射到上傳動作的action類是struts.xml文件,如上所示。 – user3108790

回答

4

除了改變saveDir(真的沒有必要,而且是危險的),你沒有關注的Action類的公約:私有變量的名稱必須與其Getters和Setters的名稱匹配;最後,在頁面中,您通過指向私有變量而不是指定者而使名稱不匹配。將其更改爲:

public class UploadAction extends ActionSupport{ 

    private File upload; 
    private String uploadFileName; 
    private String uploadContentType; 

    public void setUpload(File upload){ 
     this.upload=upload; 
    } 
    public void setUploadContentType(String uploadContentType){ 
     this.uploadContentType=uploadContentType; 
    } 
    public void setUploadFileName(String uploadFileName){ 
     this.uploadFileName=uploadFileName; 
    } 

    @Override 
    public String execute(){ 
     if(upload==null) 
     { 
      System.out.println("No file...."); 
     } 
     System.out.println(uploadContentType); 
     System.out.println(uploadFileName); 
     return SUCCESS; 
    } 
} 

JSP

<s:form action="upload" method="post" enctype="multipart/form-data"> 
    <input type="file" name="upload" id="uploadfile" /> 
    <input type="submit" id="submit" /> 
</s:form> 
2

更改此

 <input type="file" name="file" id="uploadfile" /> 

 <input type="file" name="upload" id="uploadfile" /> 

你你的動作類中的setter是setUpload,所以它正在尋找一個名爲upload的請求參數,而不是文件。對於公約的緣故,你也應該改變

private File file; 

public void setUpload(File file){ 
    this.file=file; 
} 

private File upload; 

public void setUpload(File file){ 
    this.upload=file; 
}