struts2檔案下載及 inputStream的理解

碼字猴code_monkey發表於2014-08-21

struts.xml檔案配置:

[html] view plaincopy
  1. <span style="font-size:16px;"><?xml version="1.0" encoding="UTF-8" ?>  
  2. <!DOCTYPE struts PUBLIC  
  3.     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  
  4.     "http://struts.apache.org/dtds/struts-2.0.dtd">  
  5.   
  6. <struts>  
  7.     <constant name="struts.enable.DynamicMethodInvocation" value="false" />  
  8.     <constant name="struts.devMode" value="true" />  
  9.   
  10.     <package name="app14a" extends="struts-default">  
  11.         <action name="Menu">  
  12.             <result>/jsp/Menu.jsp</result>  
  13.         </action>  
  14.         <action name="ViewCss" class="app14a.FileDownloadAction">  
  15.             <result name="success" type="stream">  
  16.                 <param name="inputName">inputStream</param>  
  17.                 <param name="contentType">text/css</param>  
  18.                 <param name="contentDisposition">filename="main11.css"</param>  
  19.                 <param name="bufferSize">2048</param>  
  20.             </result>  
  21.         </action>  
  22.         <action name="DownloadCss" class="app14a.FileDownloadAction">  
  23.             <result name="success" type="stream">  
  24.                 <param name="inputName">inputStream</param>  
  25.                 <param name="contentType">application/octet-stream</param>  
  26.                 <param name="contentDisposition">filename="main111222.css"</param>  
  27.                 <param name="bufferSize">2048</param>  
  28.             </result>  
  29.         </action>  
  30.     </package>  
  31. </struts></span>  

    action特殊的地方在於result的型別是一個流(stream),配置stream型別的結果時,因為無需指定實際的顯示的物理資源,所以無需指定location屬性,只需要指定inputName屬性,該屬性指向被下載檔案的來源,對應著Action類中的某個屬性,型別為InputStream,,struts2會尋找一個返回型別為InputStream的方法getInputStream()(方法名最好為getInputStream,有人說此方法名可以為別的可能需要與struts.xml中的inputName儲存一致下面有解釋,不過我實驗的結果不是這樣,須為getInputStream,可能是org.apache.struts2.dispatcher.ResultStream類限制造成,感興趣的可以看看此類的原始碼,就會明白的),得到InputStream。

    另一種理解:action中定義一個返回InputStream的方法,該方法作為被下載檔案的入口,且需要配置stream型別結果時指定inputName引數,inputName引數的值就是方法去掉get字首、首字母小寫的字串。

下面則列出了和下載有關的一些引數列表: 

引數說明 
contentType 
內容型別,和網際網路MIME標準中的規定型別一致,例如text/plain代表純文字,text/xml表示XML,image/gif代表GIF圖片,image/jpeg代表JPG圖片 

inputName 
下載檔案的來源流,對應著action類中某個型別為Inputstream的屬性名,例如取值為inputStream的屬性需要編寫getInputStream()方法 

contentDisposition 
檔案下載的處理方式,包括內聯(inline)和附件(attachment)兩種方式,而附件方式會彈出檔案儲存對話方塊,否則瀏覽器會嘗試直接顯示檔案。取值為: 

attachment;filename="struts2.txt",表示檔案下載的時候儲存的名字應為struts2.txt。如果直接寫filename="struts2.txt",那麼預設情況是代表inline,瀏覽器會嘗試自動開啟它,等價於這樣的寫法:inline; filename="struts2.txt" 

bufferSize 
下載緩衝區的大小

相關文章