1. 程式人生 > >HttpServletResponse下載檔案(中文名稱下載)-------手動編碼實現下載

HttpServletResponse下載檔案(中文名稱下載)-------手動編碼實現下載

DownloadServlet:
 

package com.yuming.servlet;

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

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


import com.yuming.util.Base64Util;

/**
 * Servlet implementation class DownloadServlet
 */
public class DownloadServlet extends HttpServlet {

		protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
			
			//1. 獲取要下載的檔名字 aa.jpg  --- inputStream
			String fileName = request.getParameter("filename");
			
			//get請求,這個fileName有中文
			fileName = new String(fileName.getBytes("UTF-8"),"UTF-8");
			System.out.println("fileName="+fileName);
			
			
			//2. 獲取這個檔案在tomcat裡面的絕對路徑地址
			String path = getServletContext().getRealPath("download/"+fileName);
			
			/**
			 * 如果檔案的名字帶有中文,需要對檔名進行編碼處理
			 * 
			 * IE/chrome 使用URLEncoding編碼
			 * 
			 * Firefox ,使用base64 編碼
			 */
			String clientType = request.getHeader("User-Agent");
			if(clientType.contains("Firefox")){
				fileName = Base64Util.base64EncodeFileName(fileName);
			}else{
				//IE ,或者  Chrome (谷歌瀏覽器) ,
				//對中文的名字進行編碼處理
				fileName = URLEncoder.encode(fileName, "UTF-8");
			}
			
			//讓瀏覽器收到這份資源的時候, 以下載的方式提醒使用者,而不是直接展示。 
			response.setHeader("Content-Disposition", "attachment; filename="+fileName);
			
//			response.setStatus(302);
//			response.setHeader("Location", "login_success.html");
			
			//
			//response.sendRedirect("login_success.html");
			
			//3. 轉化成輸入流
			InputStream is = new FileInputStream(path);
			OutputStream os = response.getOutputStream();
			
			int len = 0 ;
			byte[]buffer = new byte[1024];
			while( (len = is.read(buffer)) != -1){
				os.write(buffer, 0, len);
			}
			
			os.close();
			is.close();
		
		}

		protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
			doGet(request, response);
		}
}

Base64Util:
 

package com.yuming.util;

import java.io.UnsupportedEncodingException;

import sun.misc.BASE64Encoder;

public class Base64Util {
	
	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);
		}
	}

}

web.xml:
 

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	id="WebApp_ID" version="2.5">
	<display-name>Download</display-name>
	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
		<welcome-file>index.htm</welcome-file>
		<welcome-file>index.jsp</welcome-file>
		<welcome-file>default.html</welcome-file>
		<welcome-file>default.htm</welcome-file>
		<welcome-file>default.jsp</welcome-file>
	</welcome-file-list>
	<servlet>
		<description></description>
		<display-name>DownloadServlet</display-name>
		<servlet-name>DownloadServlet</servlet-name>
		<servlet-class>com.yuming.servlet.DownloadServlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>DownloadServlet</servlet-name>
		<url-pattern>/DownloadServlet</url-pattern>
	</servlet-mapping>
</web-app>

download.html:
 

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

	<h2>tomcat預設servlet提供下載</h2>
	<a href="download/aa.jpg">aa.jpg</a><br />
	<a href="download/bb.txt">bb.txt</a><br />
	<a href="download/cc.rar">cc.rar</a><br />
	
	<br>手動編碼提供下載。:<br>
	<a href="DownloadServlet?filename=aa.jpg">aa.jpg</a><br>
	<a href="DownloadServlet?filename=bb.txt">bb.txt</a><br>
	<a href="DownloadServlet?filename=cc.rar">cc.rar</a><br>
	<a href="DownloadServlet?filename=大海.jpg">大海.jpg</a><br>

</body>
</html>

 

 谷歌,火狐都可以下載喲...

 有個問題,求解

換成ISO-8859-1之後:

 

控制檯報錯 :

十二月 21, 2018 10:16:39 上午 org.apache.catalina.core.StandardWrapperValve invoke
嚴重: Servlet.service() for servlet [DownloadServlet] in context with path [/Download] threw exception
java.lang.NullPointerException
	at java.io.FileInputStream.<init>(FileInputStream.java:130)
	at java.io.FileInputStream.<init>(FileInputStream.java:93)
	at com.yuming.servlet.DownloadServlet.doGet(DownloadServlet.java:62)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:622)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
	at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:522)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1095)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:672)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1502)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1458)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:748)

fileName=??.jpg