解決jsp下載檔案報錯getOutputStream() has already,及無法下載中文名稱標題的問題
下載的jsp程式碼
1、其中紫色部份解決,傳值中文亂碼問題
2、紅色部份解決,下載標題為中文的問題(2 種解決方法)
3、黃色背景部份解決下載點選取消或者下載過程中報錯(java.lang.IllegalStateException: getOutputStream() has already been called for this response)異常問題
轉自:http://bbs.csdn.net/topics/300101546。
方法1:
response.setHeader("Content-Disposition", "attachment; filename=" + java.net.URLEncoder.encode(fileName, "UTF-8"));
下載的程式裡有了上面一句,一般在IE6的下載提示框上將正確顯示檔案的名字,無論是簡體中文,還是日文。但是文字只要超過17個字,就不能下載了。
一. 通過原來的方式,也就是先用URLEncoder編碼,當中文文字超過17個時,IE6 無法下載檔案。這是IE的bug,參見微軟的知識庫文章 KB816868 。原因可能是IE在處理 Response Header 的時候,對header的長度限制在150位元組左右。而一個漢字編碼成UTF-8是9個位元組,那麼17個字便是153個位元組,所以會報錯。而且不跟字尾也不對.
方法2:
response.setHeader( "Content-Disposition", "attachment;filename=" + new String( fileName.getBytes("gb2312"), "ISO8859-1" ) );
在確保附件檔名都是簡 體中文字的情況下,那麼這個辦法確實是最有效的,不用讓客戶逐個的升級IE。如果臺灣同胞用,把gb2312改成big5就行。但現在的系統通常都加入了 國際化的支援,普遍使用UTF-8。如果檔名中又有簡體中文字,又有繁體中文,還有日文。那麼亂碼便產生了。另外,在上Firefox (v1.0-en)下載也是亂碼。
<%@ page language="java" import="java.util.*" pageEncoding="utf-8" contentType="text/html; charset=utf-8"%> <%@ page import="com.jspsmart.upload.*"%> <%@page import="java.io.File"%> <%@ page import="java.io.*"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="Content-Type" content="text/html charset=utf-8"> </head> <body> <% response.setContentType("text/html"); request.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8"); <span style="color:#cc33cc;">String address = java.net.URLDecoder.decode(request .getParameter("address")); String filename = java.net.URLDecoder.decode(request .getParameter("filename"));</span> <span style="color:#cc33cc;">filename = new String(filename.getBytes("ISO-8859-1"), "utf-8"); address = new String(address.getBytes("ISO-8859-1"), "utf-8");</span> System.out.println(filename + address); File fileLoad = new File(address); System.out.println(fileLoad.getAbsolutePath()); if (!fileLoad.exists()) { out.print(fileLoad.getAbsolutePath() + " File Not Exist !"); %> <script type="text/javascript"> alert("檔案不存在。請聯絡管理人員"); window.history.back(); </script> <% return; } javax.servlet.ServletOutputStream ou = response.getOutputStream(); java.io.FileInputStream fileInputStream = new FileInputStream(fileLoad); try{ // SmartUpload su = new SmartUpload(); // 新建一個SmartUpload物件 //su.initialize(pageContext); // 初始化 //su.setContentDisposition(null); // 設定contentDisposition為null以禁止瀏覽器自動開啟檔案, //保證點選連結後是下載檔案。若不設定,則下載的副檔名為 //doc時,瀏覽器將自動用word開啟它。副檔名為pdf時,將用acrobat開啟 //response.sendRedirect(path+"/updown/updown_err.jsp"); //su.downloadFile("/uploadPath/file/liu.doc"); // 下載英文檔案 //su.downloadFile(address, null, filename); // 下載中文檔案 //downloadFile(String sourceFilePathName, String contentType, String destFileName) //out.flush(); // response.flushBuffer(); //out.clear(); //out=pageContext.pushBody(); //response.setContentType("text/html"); if (filename != null && filename.length() > 0) { response.setContentType("application/x-msdownload");
<span style="white-space:pre"> </span><span style="background-color: rgb(255, 255, 51);"><span style="color:#ff0000;">// /**此行程式碼不能改變gbk為Utf-8不然還是一樣下載不了,不知道為什麼會這樣。 */</span></span> //response.setHeader("Content-Disposition","attachment; filename="+<span style="color:#ff0000;">new String(filename.getBytes("gbk"), "ISO8859-1" ));</span> response.setHeader("Content-Disposition","attachment; filename="+<span style="color:#cc0000;">java.net.URLEncoder.encode(filename, "UTF-8")</span>); if (fileInputStream != null) { int filelen = fileInputStream.available(); byte[] a = new byte[filelen]; fileInputStream.read(a); ou.write(a); } <span style="background-color: rgb(255, 255, 51);">fileInputStream.close(); ou.close();</span> } <span style="background-color: rgb(255, 255, 51);">out.clear(); out = pageContext.pushBody();</span> }catch(Exception e){ <span style="background-color: rgb(255, 255, 0);">fileInputStream.close(); ou.close(); out.clear(); out = pageContext.pushBody();</span> %> <script type="text/javascript"> alert("下載檔案異常,請聯絡管理人員"); window.history.back(); </script> <% } %> </body> </html>