HttpServletResponse下載檔案(中文名稱下載)-------手動編碼實現下載
阿新 • • 發佈:2018-12-21
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