Select解决中文文件下载问题

来源:互联网 发布:淘宝怎么查看我的评价 编辑:程序博客网 时间:2024/04/30 07:48

刚刚学完在Servlet中解决下载中文文件的知识,稍稍总结一下。


首先贴上HTML代码:

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>文件下载</title></head><body>    <h1>通过服务器端编码的方式实现文件下载</h1>    <a href="/download?filename=a.jpg">a.jpg</a><br>    <a href="/download?filename=a.flv">a.flv</a><br>    <a href="/download?filename=a.mp3">a.mp3</a><br>    <a href="/download?filename=a.mp4">a.mp4</a><br>    <a href="/download?filename=a.txt">a.txt</a><br>    <a href="/download?filename=a.zip">a.zip</a><br>    <a href="/download2?filename=美女.jpg">美女.jpg</a><br></body></html>

因为通过a便签的形式进行链接转跳,并且包含了参数filename。因此可以在java代码中使用下列代码获取:

 String filename = request.getParameter("filename"); 


但是因此产生了一个问题,获取的参数是中文,但是Tomcat的编码不支持中文,因此会将参数解析为乱码。

此时点击下载标签会出现500错误。

因此,对filename参数重新编码如下:

 //解决中文参数的乱码问题        filename = new String(filename.getBytes("ISO8859-1"),"UTF-8");//美女.jpg

此时,文件下载代码如下:
//设置下载类型  -- 需要根据服务器的资源后缀名进行获取,因此使用filename变量        response.setContentType(this.getServletContext().getMimeType(filename));        //设置header。通知客户端以附件的形式打开,而不需要解析        response.setHeader("Content-Disposition","attachment;filename="+filenameEncoder);        //获取文件的绝对路径        String path = this.getServletContext().getRealPath("download/" + filename);        //获取文件输入流        InputStream in = new FileInputStream(path);        //获取文件输出流        ServletOutputStream out = response.getOutputStream();        //向客户端输出文件        int len = 0;        byte[] buff = new byte[1024];        while ((len = in.read(buff)) != -1){            out.write(buff,0,len);        }        //关闭连接        in.close();         //需要手动关闭,因为是自己new的//      out.close();        //在开发中一般不需要手动关闭此连接,因为容器会自动检测并关闭

代码中的filenameEncoder下面会进行说明


此时,客户端会将文件进行下载,但是文件名依然是乱码或者其他现象。

那是因为不同客户端会使用他们默认的解码方式对文件名进行解码,导致文件下载出错。

因此我们需要手动修改响应头中的User-Agent来指定解码方式。

代码如下:

  String filenameEncoder = "";        String agent = request.getHeader("User-Agent");        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");        }

完成以上操作后,中文文件下载问题解决。

完整代码:

package com.liweijian.content;import sun.misc.BASE64Encoder;import javax.servlet.ServletException;import javax.servlet.ServletOutputStream;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.net.URLEncoder;/** * @Author:Liweijian * @Description: 解决中文文件下载 * @Date:Create in 20:14 2017/11/16 0016 */@WebServlet(name = "DownloadServlet2")public class DownloadServlet2 extends HttpServlet {    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {        doGet(request, response);    }    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {        //获取传递进来的filename参数        String filename = request.getParameter("filename"); //????.jpg            //解决中文参数的乱码问题            filename = new String(filename.getBytes("ISO8859-1"),"UTF-8");//美女.jpg        //因为客户端会对该文件名进行默认解码,所以可能导致下载的文件名出错。        //因此,需要使用相应的客户端编码格式进行编码        String filenameEncoder = "";        String agent = request.getHeader("User-Agent");        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");        }        //设置下载类型  -- 需要根据服务器的资源后缀名进行获取,因此使用filename变量        response.setContentType(this.getServletContext().getMimeType(filename));        //设置header。通知客户端以附件的形式打开,而不需要解析        response.setHeader("Content-Disposition","attachment;filename="+filenameEncoder);        //获取文件的绝对路径        String path = this.getServletContext().getRealPath("download/" + filename);        //获取文件输入流        InputStream in = new FileInputStream(path);        //获取文件输出流        ServletOutputStream out = response.getOutputStream();        //向客户端输出文件        int len = 0;        byte[] buff = new byte[1024];        while ((len = in.read(buff)) != -1){            out.write(buff,0,len);        }        //关闭连接        in.close();         //需要手动关闭,因为是自己new的//      out.close();        //在开发中一般不需要手动关闭此连接,因为容器会自动检测并关闭    }}


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 身份证丢失怎么办健康证 个人怎么办武汉健康证 山海关古御壹号怎么办房本? 车玻璃被炮烧了怎么办 奔驰钥匙没电怎么办 婚内买的车离婚怎么办 离心风机噪音大怎么办 匹凸匹被st五牛怎么办 考不进去中学怎么办 教师体检来例假怎么办 老板拖欠农民工工资怎么办 公司破产拖欠员工工资怎么办 白玉蜗牛下蛋了怎么办 黄牛卖不出的票怎么办 鸡受风寒不产蛋怎么办 蛋鸡感冒不下蛋怎么办 牛肉煮老了怎么办 牛肉炖碎了怎么办 比值审敛法等于1怎么办 华为手机停止运行怎么办 易事通卡怎么办延期 三星手机照相机故障怎么办 凌晨一点到机场怎么办 凌晨3点醒来怎么办 凌晨四五点咳嗽怎么办 凌晨4点大便怎么办 熊猫小课付了费怎么办 华为手机系统升级后卡机怎么办 孕妇汗脚脚臭怎么办 巴基斯坦留学生丢失护照怎么办 vivox20耳机进水了怎么办 轴圆齿之间间隙大怎么办 浩辰cad2017保存不了怎么办 会议无poster版块怎么办 大四考研失败了怎么办 博士退学老师不同意怎么办? 贴双眼皮眼皮松怎么办 dpf灯亮了怎么办 60岁社保没交满怎么办 老公素质太差怎么办 耿彦波退休了太原怎么办