天天看點

檔案的下載下傳(2)——解決下載下傳檔案名的亂碼問題

首先是html頁面代碼

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h2>請點選進行檔案的下載下傳</h2>
	<h3>超連結的下載下傳</h3>
	<a href="/Servlet/download/aaa.txt">aaa.txt</a><br/>
	<a href="/Servlet/download/E75A8555.JPG">E75A8555.JPG</a><br/>
	<a href="/Servlet/download/E75A8690.JPG">E75A8690.JPG</a><br/>
	<a href="/Servlet/download/zhcx.rar">zhcx.rar</a><br/>
	
	<h3>手動編碼方式下載下傳</h3>
	<a href="/Servlet/DownloadServlet?filename=aaa.txt">aaa.txt</a><br/>
	<a href="/Servlet/DownloadServlet?filename=美女.JPG">美女.JPG</a><br/>
	<a href="/Servlet/DownloadServlet?filename=E75A8690.JPG">E75A8690.JPG</a><br/>
	<a href="/Servlet/DownloadServlet?filename=zhcx.rar">zhcx.rar</a><br/>
</body>
</html>
           

可以清晰的看到在手動編碼方式下載下傳過程中是有一個中文名的檔案,但是在下載下傳過程中我們要解決兩個方面,則不會出現下載下傳時中文名變成亂碼

1、當我們将檔案名從html傳到servlet的時候這時候以get的方式會接受到亂碼,是以我們在接收參數的時候應該這樣寫

這樣的話我們接收的就是中文

2、根據不同的浏覽器要進行不同的操作,故我們應該先檢查一下浏覽器的類型代碼如下:

//根據浏覽器的類型進行中文檔案的亂碼問題:
		String agent=request.getHeader("User-Agent");
		if(agent.contains("Firefox")){
			filename=base64EncodeFileName(filename);
		}else{
			filename=URLEncoder.encode(filename,"UTF-8");
		}
           

隻要滿足以上兩點,則下載下傳時中文名便不會出現亂碼的現象。

完整的Servlet代碼如下,需要的小夥伴可以自行參考:

package download;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import sun.misc.BASE64Encoder;

/**
 * 檔案下載下傳的編寫
 */
public class DownloadServlet extends HttpServlet {
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//1.接收參數
		String filename=new String(request.getParameter("filename").getBytes("ISO-8859-1"),"UTF-8");
		//2完成檔案下載下傳(設定Content-Type頭、設定Content-Disposition頭、設定檔案的InputStream)
		//2.1設定Content-Type頭
		String type=this.getServletContext().getMimeType(filename);
		response.setHeader("Content-Type", type);
		
		//2.3設定檔案的InputStream
		String realPath=this.getServletContext().getRealPath("/download/"+filename);
		
		//根據浏覽器的類型進行中文檔案的亂碼問題:
		String agent=request.getHeader("User-Agent");
		if(agent.contains("Firefox")){
			filename=base64EncodeFileName(filename);
		}else{
			filename=URLEncoder.encode(filename,"UTF-8");
		}
		
		//2.2設定Content-Disposition頭
		response.setHeader("Content-Disposition", "attachment;filename="+filename);
		
		InputStream is=new FileInputStream(realPath);
		//獲得response的輸出流
		OutputStream os=response.getOutputStream();
		int len=0;
		byte[]b=new byte[1024];
		while((len=is.read(b))!=-1){
			os.write(b, 0, len);
		}
		is.close();
	}

	public static String base64EncodeFileName(String fileName) {
		BASE64Encoder base64Encoder = new BASE64Encoder();
		try {
			return "=?UTF-8?B?"
					+ new String(base64Encoder.encode(fileName
							.getBytes("UTF-8"))) + "?=";
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		}
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}