package 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 Utils.DownloadUtil; /** * Servlet implementation class demo3 */ public class demo3 extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 1. 获取要下载的文件名字 例如aa.jpg --- inputStream String fileName = request.getParameter("filename"); // 解决get请求中有中文 fileName = new String(fileName.getBytes("ISO-8859-1"), "UTF-8"); // 2. 获取这个文件在tomcat里面的绝对路径地址 String path = getServletContext().getRealPath("download/" + fileName); /** *解决下载文件时显示的中文问题 * ie 或者google使用 URLEncoder * 火狐用 base64 */ //读取消息头 判断浏览器类型 String clienrType = request.getHeader("User-Agent"); if (clienrType.contains("Firefox")) { fileName = DownloadUtil.base64EncodeFileName(fileName); } else { fileName = URLEncoder.encode(fileName, "UTF-8"); } // 让浏览器收到这份资源的时候, 以下载的方式提醒用户,而不是直接展示。 response.setHeader("Content-Disposition", "attachment; filename=" + fileName); // 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 { // TODO Auto-generated method stub doGet(request, response); } }
配套火狐解析工具类
package Utils; import java.io.UnsupportedEncodingException; import sun.misc.BASE64Encoder; public class DownloadUtil { // 设置火狐下载 中文名称工具类 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); } } }解决
import sun.misc.BASE64Encoder;
不能导入问题