1. 程式人生 > >解決jsp下載檔案報錯getOutputStream() has already,及無法下載中文名稱標題的問題

解決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>