JavaWeb—文件下载(解决乱码问题)

下载文件

  1. 直接使用a标签来去下载

有些内容会浏览器自动解析,浏览器不能解析的文件才会被下载,不采用这种方法。

  1. 通过发送Servlet请求来去下载
    通过发送一个Servlet请求,把文件名发送给服务器,发送给服务器后,接收到文件名参数,获取文件的绝对地址,通过流的形式来去写到浏览器。
    还得要告诉文件是什么类型,浏览器是以MIME的类型来识别类型。
this.getServletContext().getMimeType(“文件名称”);

设置响应头的类型(MIME)

response.setContentType("MIME类型")
//即
response.setContentType(this.getServletContext().getMimeType(“文件名称”));

设置响应头,告诉浏览器不要去解析,是以附件的形式打开

response.setHeader("Content-Dsiposition","attachment;filename="+文件名)

步骤
1.接收文件名参数
2.获取mime类型
3.设置浏览器响应类型
4.告诉浏览器以附件形式下载
5.获取文件的绝对路径
6.读取文件流
7.获取输出流
8.把内容写出到输出流

文件路径:
在这里插入图片描述
jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<a href="/Servlet6?filename=1.jpg">1.jpg</a><br/>
<a href="/Servlet6?filename=a.txt">a.txt下载</a>
</body>
</html>

@WebServlet("/Servlet6")
public class Servlet6 extends HttpServlet {
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //接收文件名参数
        String filename = request.getParameter("filename");
        /* 对接收的参数进行编码处理
        * 获取参数,默认会对参数进行编码ISO8859-1
        * 把乱码转成二进制位*/
        byte[] bytes = filename.getBytes("ISO8859-1");
        /*使用UTF-8进行编码*/
        filename = new String(bytes,"UTF-8");
        /*根据文件名来获取mime类型*/
        String mime = this.getServletContext().getMimeType(filename);
        /*设置mimeType*/
        response.setContentType(mime);
        /*告诉浏览器中文编码*/
        // 获取客户端信息
        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.setHeader("Content-Disposition", "attachment;filename="+filenameEncoder);
        //获取文件的绝对路径
        String path = this.getServletContext().getRealPath("img/"+filename);
        System.out.println(path);
        //3.读取文件流
        FileInputStream in = new FileInputStream(path);
        //4.获取输出流
        ServletOutputStream out = response.getOutputStream();
        //5.把内容写出到输出流
        byte[] buffer = new byte[1024];
        int len = 0;
        while((len = in.read(buffer)) != -1) {
            out.write(buffer, 0, len);
        }
        in.close();
    }


}
发布了25 篇原创文章 · 获赞 0 · 访问量 278

猜你喜欢

转载自blog.csdn.net/qq_42219004/article/details/105300050
今日推荐