解決文件名是中文時的下載亂碼問題

jsp代碼

<%@page import="java.net.URLEncoder"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>文件下載</title>
</head>
<body>
<a href="/chapter12/DownloadServlet?filename=timg.jpg">文件下載-----文件名是英文</a>
<br><br><br><br><br>
<a href="/chapter12/DownloadServlet?filename=<%=URLEncoder.encode("解決辦法.docx", "utf-8")%>">文件下載----文件名是中文第一種方案</a>
<br><br><br><br><br>
<a href="/chapter12/DownloadServlet?filename=解決辦法.docx">文件下載----文件名是中文第二種方案</a>
</body>
</html>

DownUtil代碼 (這段代碼爲模板代碼,不需要記憶理解即可)

package com.zch.upload;

import sun.misc.*;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;

import javax.servlet.http.HttpServletRequest;

public class DownUtils {
	public static String filenameEncoding(String filename, HttpServletRequest request) throws UnsupportedEncodingException {
		// 獲得請求頭中的User-Agent
		String agent = request.getHeader("User-Agent");
		// 根據不同的客戶端進行不同的編碼

		if (agent.contains("MSIE")) {
			// IE瀏覽器
			filename = URLEncoder.encode(filename, "utf-8");
		} else if (agent.contains("Firefox")) {
			// 火狐瀏覽器
			BASE64Encoder base64Encoder = new BASE64Encoder();
			filename = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
		} else {
			// 其它瀏覽器
			filename = URLEncoder.encode(filename, "utf-8");
		}
		return filename;
	}
}

DownloadServlet代碼

package com.zch.upload;

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;

/**
 * 
 * @ClassName: DownloadServlet.java
 * @Description: 文件的下載
 * @author 萌城小小小少年
 * @version V1.0
 * @Date 2019年2月15日 下午7:23:35
 *
 */
public class DownloadServlet extends HttpServlet {

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 處理響應中文的亂碼問題
		response.setContentType("text/html;charset=utf-8");
		// 1.獲取下載文件的名稱
		String filename = request.getParameter("filename");
		//處理get請求的中文亂碼問題
		filename=new String(filename.getBytes("iso-8859-1"),"utf-8");
		// 2.獲取文件的mime類型
		String fileType = getServletContext().getMimeType(filename);
		String name=DownUtils.filenameEncoding(filename, request);
		// 設置兩個頭
		response.addHeader("Content-Type", fileType);
		response.addHeader("Content-Disposition", "attachment;filename=" +name);
		// 4.文件的下載
		String folder = "/download/";
		// 4.1獲取文件的字節輸入流
		InputStream in = getServletContext().getResourceAsStream(folder + filename);
		// 4.2獲取文件的字節輸出流
		OutputStream out = response.getOutputStream();
		// 5.流的對接
		byte[] buffer = new byte[1024];
		int len = 0;
		while ((len = in.read(buffer)) != -1) {
			out.write(buffer, 0, len);
		}
		// 關閉流
		out.close();
		in.close();
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章