struts2中檔案下載以及中文亂碼
阿新 • • 發佈:2019-02-17
昨天在試著做一個使用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");
解決了我的問題,
希望能幫到遇到同樣問題的夥伴。