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格式;

posted @ 2020-05-12 11:25  丿狂奔的蜗牛  阅读(300)  评论(0编辑  收藏  举报