public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 获取下载文件名称 String filename = request.getParameter("filename"); // 中文乱码问题 filename = new String(filename.getBytes("ISO8859-1"), "UTF-8"); // 获取请求头 String agent = request.getHeader("User-Agent"); String filenameEnconding = ""; // 根据不同的浏览器进行编码(模板代码) if (agent.contains("MSIE")) { // IE浏览器 filenameEnconding = URLEncoder.encode(filename, "utf-8"); filenameEnconding = filenameEnconding.replace("+", " "); } else if (agent.contains("Firefox")) { // 火狐浏览器 BASE64Encoder base64Encoder = new BASE64Encoder(); filenameEnconding = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?="; } else { // 其它浏览器 filenameEnconding = URLEncoder.encode(filename, "utf-8"); } // 要下载的文件类型 --客户端通过文件的MIME类型区分文件类型 response.setContentType(this.getServletContext().getMimeType(filename)); // 告诉客户端文件不可以直接解析,需要下载 response.setHeader("Content-Disposition", "attachment;filename=" + filenameEnconding); // 获取文件绝对路径 String path = this.getServletContext().getRealPath("download/" + filename); // 创建输入流 InputStream in = new FileInputStream(path); // 获取输出流 通过response获取 ServletOutputStream out = response.getOutputStream(); int len = 0; byte[] b = new byte[1024]; while ((len = in.read(b)) != -1) { // 将字节数组写给客户端 out.write(b, 0, len); } // 释放资源 in.close(); }
<title>下载页</title> </head> <body> <h1>使用A标签直接指向服务器上的资源提供下载功能</h1> <a href="/web01/download/aaa.txt">aaa.txt</a> <a href="/web01/download/dameinv.jpg">dameinv.jpg</a> <a href="/web01/download/dameinv.zip">dameinv.zip</a> <h1>使用服务器编码端实现文件下载</h1> <a href="/web01/download?filename=aaa.txt">aaa.txt</a> <a href="/web01/download?filename=dameinv.jpg">dameinv.jpg</a> <a href="/web01/download?filename=dameinv.zip">dameinv.zip</a> <a href="/web01/download?filename=反射.txt">反射.txt</a> </body> </html>