1. 程式人生 > >struts2中檔案下載以及中文亂碼

struts2中檔案下載以及中文亂碼

       昨天在試著做一個使用struts2檔案下載的功能,基本上沒有考慮到亂碼的問題,因為當時檔案都是以數字進行命名的,下載過程中沒有出現問題。

下面給出程式碼,

Action類,

public class DocDownloadAction extends ActionSupport{
         private String downPath;//下載檔案的檔案位置
         public InputStream getInputStream(){
        	 //返回InputStream流方法
        	 return ServletActionContext.getServletContext().getResourceAsStream(downPath);
         }
		public String getDownPath() {
			return downPath;
		}
		public void setDownPath(String downPath) {
			this.downPath = downPath;
		}
		//檔名轉換編碼,防止中文亂碼
         public String getDownloadFileName(){
        	 String downFileName = downPath.substring(7);
        	 try {
				downFileName = new String(downFileName.getBytes(),"UTF-8");
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
        	 return downFileName;
         }
         @Override
        public String execute() throws Exception {
             
        	 return SUCCESS;
        }
}
配置,
 <action name="downLoad" class="com.mxl.action.DocDownloadAction">
    <result type="stream"><!-- 指定結果型別為stream型別 -->
       <param name="contentType">           <!-- 指定下載檔案的檔案型別 -->
       application/msword,text/plain,application/vnd.ms-powerpoint,application/vnd.ms-excel
       </param>
       <param name="inputName">inputStream</param><!-- 指定下載檔案的入口輸入流 -->
       <param name="contentDisposition">
        attachment;filename="${downloadFileName}"<!-- 指定下載檔案的處理方式與檔案儲存名 -->
       </param>
       <param name="bufferSize">40960</param><!-- 指定下載檔案的緩衝區大小 -->
    </result>
   </action>
介面:
 <font style="font-size:12px; color:red">上傳者<s:property value="name"/></font>
    <table cellpadding="0" cellspacing="0">
      <tr>
      <th>檔名稱</th>
      <th>上傳時間</th>
      </tr>
      <s:iterator value="uploadFileName" status="st" var="doc">
      <tr>
       <td><a href="downLoad.action?downPath=upload/<s:property value="#doc"/>"><s:property value="#doc"/></a></td>
       <td><s:date name="createTime" format="yyyy-MM-dd HH:mm:ss"/></td>
      </tr>
      </s:iterator>
    </table>

當時測試的時候因為檔案命名沒有用到中文,就沒有出錯,

後來在練習下載許可權控制的時候我發現了這個問題,剛開始程式碼是這樣,

  public InputStream getInputStream(){
        	 //返回InputStream流方法
        	 return ServletActionContext.getServletContext().getResourceAsStream(Path);
         }
當檔案命名為中文時,檔案不能下載,這裡邊返回值為空,經過測試後發現downPath中的檔名是亂碼的,在網上搜了一下好多方法,都試了試,最後在return前邊加了一句,

 path = new String(path.getBytes("ISO8859-1"),"utf-8");

解決了我的問題,但是修改後,檔案是能夠下載了,但是在瀏覽器中顯示的檔名是亂碼的,分析以後發現是這裡邊出的問題,未修改之前的程式碼,

  public String getDownloadFileName(){
        	 String downFileName = downPath.substring(7);
        	 try {
				downFileName = new String(downFileName.getBytes(),"UTF-8");
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
        	 return downFileName;
         }
我試著將上邊的那行程式碼裡邊的編碼方式交換,

downFileName = new String(downFileName.getBytes("utf-8"),"ISO8859-1");

解決了我的問題,

希望能幫到遇到同樣問題的夥伴。