java编写文件下载
一、有四种格式 txt /png/zip/mp4格式
这个地方 a 标签是get请求方式 传参数的话 在后面+?+参数
<%@ 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>Insert title here</title> </head> <body> <a href="/WEB02/downloadservlet?filename=a.txt">a.txt</a> // ?filename=a.txt get是在请求行中 直接在后面拼接 key和value的值(值随便取名)
<a href="/WEB02/downloadservlet?filename=乔丹.png">乔丹.png</a>
<a href="/WEB02/downloadservlet?filename=a.zip">a.zip</a>
<a href="/WEB02/downloadservlet?filename=a.mp4">a.mp4</a>
</body>
</html>
二、
public class downloadservlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 获取文件名 String filename = request.getParameter("filename"); // get请求解决乱码 filename = new String(filename.getBytes("ISO8859-1"), "utf-8"); //这个地方不写的话 下载中文版不能解析出来 如乔丹.png图片 // 获取user-agent头 String agent = request.getHeader("User-Agent"); // 解决乱码 String filenameEncoder = ""; if (agent.contains("MSIE")) { // IE浏览器 filenameEncoder = URLEncoder.encode(filename, "utf-8"); filenameEncoder = filenameEncoder.replace("+", " "); } else if (agent.contains("Firefox")) { // 火狐浏览器 BASE64Encoder base64Encoder = new BASE64Encoder(); filenameEncoder = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?="; } else { // 其它浏览器 filenameEncoder = URLEncoder.encode(filename, "utf-8"); } // 告知浏览器文件的类型 response.setContentType(getServletContext().getMimeType(filename)); // 告知浏览器文件的打开方式是下载 response.setHeader("Content-Disposition", "attachment;filename=" + filenameEncoder); // 获得文件所在服务器绝对路径 String filepath = getServletContext().getRealPath("download/" + filename); // 明确数据源 FileInputStream fis = new FileInputStream(filepath); // 明确目的地 ServletOutputStream sos = response.getOutputStream(); int len = 0; byte[] bytes = new byte[1024]; while ((len = fis.read(bytes)) != -1) { sos.write(bytes, 0, len); } fis.close(); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
3.页面在下载时会出现中文乱码或不能显示文件名的情况, 原因是不同的浏览器默认对下载文件的编码方式不同;
4.为解决这个乱码 编写了一个方法:
// 获取user-agent头 String agent = request.getHeader("User-Agent"); // 解决乱码 String filenameEncoder = ""; if (agent.contains("MSIE")) { // IE浏览器 filenameEncoder = URLEncoder.encode(filename, "utf-8"); filenameEncoder = filenameEncoder.replace("+", " "); } else if (agent.contains("Firefox")) { // 火狐浏览器 BASE64Encoder base64Encoder = new BASE64Encoder(); filenameEncoder = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?="; } else { // 其它浏览器 filenameEncoder = URLEncoder.encode(filename, "utf-8"); } // 告知浏览器文件的类型 response.setContentType(getServletContext().getMimeType(filename)); // 告知浏览器文件的打开方式是下载 response.setHeader("Content-Disposition", "attachment;filename=" + filenameEncoder);
这样就完美的解决了 是中文的 txt /png/zip/mp4格式;