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();
    }


}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值