2013-01-09 75 views
1

我在這裏閱讀所有有關此問題,因此我仔細地遵循official Struts 2 file upload docs但我仍然有問題。該操作完成後沒有錯誤,但我似乎無法捕獲上傳的文件,因爲操作內部的3個文件屬性始終爲空。這就像fileUploadInterceptor沒有完成它的工作。這裏是我的代碼:Struts 2文件上傳 - 文件屬性的實際操作爲空

動作映射:

<action name="merchantSaveOrUpdate" class="merchantSaveOrUpdateAction"> 
    <interceptor-ref name="fileUpload"> 
     <param name="allowedTypes">image/jpeg,image/gif,image/png</param> 
    </interceptor-ref> 
    <result name="success" type="redirectAction">merchantList</result> 
</action> 

的jsp:

<s:form action="merchantSaveOrUpdate" method="POST" enctype="multipart/form-data"> 
    <label>Merchant Name</label> <input type="text" value="${merchant.name}" name="name"><br /> 
    <label>Merchant Logo</label> <s:file name="logo" /> <br /> 
    <s:submit class="btn submit" /> 
</s:form> 

行動:

public class MerchantSaveOrUpdateAction extends ActionSupport { 

    private File logo; 
    private String logoContentType; 
    private String logoFileName; 
    private String name; 

    public File getLogo() { 
     return logo; 
    } 

    public void setLogo (File logo) { 
     this.logo = logo; 
    } 

    public String getLogoContentType() { 
     return logoContentType; 
    } 

    public void setLogoContentType (String logoContentType) { 
     this.logoContentType = logoContentType; 
    } 

    public String getLogoFileName() { 
     return logoFileName; 
    } 

    public void setLogoFileName (String logoFileName) { 
     this.logoFileName = logoFileName; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName (String name) { 
     this.name = name; 
    } 

    public String execute() throws Exception { 

     String result = super.execute(); 

     // the problem is here - name is populated, but the 3 logo properties are null 

     return result; 
    } 
} 

回答

2

當你定義攔截一個動作,你必須定義所有該行動的攔截器。

換句話說,你的動作目前只有一個攔截器在運行,即文件攔截器。

請注意,鏈接頁面上的配置都不包括,只有文件攔截器。

defaultStack包含文件攔截器。動作可以像這樣配置:

<action name="merchantSaveOrUpdate" class="merchantSaveOrUpdateAction"> 
    <interceptor-ref name="defaultStack"> 
     <param name="fileUpload.allowedTypes">image/jpeg,image/gif,image/png</param> 
    </interceptor-ref> 
    <result name="success" type="redirectAction">merchantList</result> 
</action> 
+0

謝謝和抱歉,對於遲到接受:)我只是現在有時間玩這個問題。 – stojke

0

關於您的問題,您可以在struts.xml中包含文件upload.xml。

<struts> 

    <include file="fileupload.xml"></include> 
    <package name="default" extends="struts-default"> 
     <!-- file upload --> 
     <action name="upload" class="com.action.FileUpload"> 
    <result name="success">success.jsp</result> 
     <result name="error">error.jsp</result> 
     </action> 

    </package> 
</struts> 

這個文件upload.xml應該包含攔截裁判...

<struts> 
    <package name="fileUploadPackage" extends="struts-default"> 
     <interceptors> 
         ------------- 
         ------------- 
     <interceptor-ref name="fileUpload"> 
     <param name="maximumSize">your file size</param> 
    <param name="allowedTypes">image/jpeg,image/gif,image/png</param> 
    </interceptor-ref> 
        ------------------ 
        ------------------ 
       </interceptors> 


    </package> 
</struts> 

,它可以在另一個還的方式來完成,請檢查該網址file upload

+1

似乎很多工作更容易處理更簡潔。 –

+0

對於上面的程序來說是這樣,但下面的鏈接(文件上傳)很簡單。實際上,如果你搜索我們不需要輸入任何代碼的文件,upload.xml就可以在谷歌中使用,你只需要將該文件包含在struts.xml中修改(圖像類型和大小)你會說什麼? – Raki

+0

我只會粘貼,因爲如果你打算在那個時候開發任何更大的應用程序,這是非常有用的,它是單獨存在的,不需要爲每個動作提供攔截器。 – Raki