jsp + servlet 通过a 标签下载文件

       在开发项目时遇到,在jsp 中通过 a 标签的方式,访问后台servlet,调用 客户端以下载的方式打开文件,遇到中文文件名乱码,找不到问题,导致下载失败问题,弄了很久才弄出点样子,不是很科学,但暂时可用

       大体思路:

     

     1.文件夹中存放要下载的文件名为 英文文件名;

     2.. 前台jsp  a标签携带 路径及文件名访问后台servlet,其中路径中只有不含有中文,文件名可以为中文,访问后台servlet;

     3. 后台先取出文件路径,和后台准备的参数进行组装拼接,得到不含中文的下载路径,构建输入流;

     4. 因为我的tomcat中的  servlet.xml 中8080端口位置有设置  编码,所以后台直接取出含有中文的文件名,作为下载文件的文件名通知客户端以下载的方式打开进行下载

servlet 中设置字符编码

<Connector port="48080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="38443" URIEncoding="ISO-8859-1"/>


jsp页面中 通过 a 标签携带信息访问后台servlet

<a href='servlet/DownLoadFileSvl?path=文件相对路径&fileName=文件名'>下载</a>

后台servlet get请求


public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        String path = request.getParameter("path");// get方式提交的
        path = new String(path.getBytes("ISO-8859-1"), "UTF-8");// 前台传上来的文件相对路径

        log.debug("前台传上来的文件相对路径: " + path);
        String path1 = this.getServletContext().getRealPath("")
                .replace(request.getContextPath() + "/", "");
        log.debug("\t\n--获取的文件夹名称:" + path1);
        String upLoad = path1 + "/file/" + path;  //组装下载路径
        upLoad = new String(upLoad.getBytes(), "utf-8");

        // 构建输入流
        InputStream in = new FileInputStream(upLoad);
        // 下载
        response.setCharacterEncoding("utf-8");
        log.debug("\n\t下载的文件名:  " + request.getParameter("fileName"));
        // 通知客户端以下载的方式打开
        response.setHeader("Content-Disposition", "attachment;filename="
                + request.getParameter("fileName"));
        OutputStream out = response.getOutputStream();

        int len = -1;
        byte b[] = new byte[1024];
        while ((len = in.read(b)) != -1) {
            out.write(b, 0, len);
        }
        in.close();
        out.close();

    }

以上就是今天的想法,没有好好整理过的,后期有时间再进行整理。





评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值