Servlet系列之(2)文件下载

文件下载理解: 将服务器端资源以流的形式写入到浏览器中

1.通过超链接下载

注意: 如果浏览器可以解析,则会直接在浏览器中打开。例如,在chrome可以直接解析 图片 和 pdf 文件,就不会弹出下载窗口


public class DownloadServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String path = getServletContext().getRealPath("/WEB-INF/classes/秋瓷炫.jpg");
        int index = path.lastIndexOf("\\");
        String name = path.substring(index+1);

        InputStream is = new FileInputStream(path);
        ServletOutputStream outputStream = resp.getOutputStream();
        int len = 0;
        byte[] bys = new byte[1024];
        while((len=is.read(bys))!=-1){
            outputStream.write(bys,0,len);
        }
        is.close();
        outputStream.close();

    }
}

2. 强制弹出下载窗口

在获取输出流之前加上:

response.setHeader("Content-Disposition", "attachment;filename="+filename);

文件名为中文时乱码处理

filename 如果是中文,会导致浏览器解析时乱码, 如下

 

4262551-0358a7e53ed3ea83.png

image.png

解决办法:
方法一:

拿到浏览器请求的usreAgent,判断是否包含MSIE, 如果有,URLEncode(filename,"GBK")
没有的话,URLEncoder.encode(filename)

 String agent = req.getHeader("User-Agent");
 System.out.println(agent);
 if(agent.indexOf("MSIE")!=-1){
      name =URLEncoder.encode(name,"GBK");
}else{
      name=URLEncoder.encode(name,"UTF-8");
}
resp.setHeader("Content-Disposition", "attachment;filename="+name);

4262551-0fb5918a6fea8a93.png

image.png

方法二:

  1. 拿到浏览器请求的usreAgent,判断是否包含MSIE,则将文件名以 gbk 编码(getBytes("GBK")) , 不包含MSIE则以 “UTF-8”编码(getBytes("UTF-8"))

  2. 然后将bytes使用ISO-8859-1解码转换为字符串,返回到浏览器。各浏览器基本都支持ISO编码

转换过程
中文 -> UTF-8 编码 ->二进制-> ISO-8859-1编码->发送到客户端 -> 客户端 将字符串 以ISO8859-1 编码->二进制-> 再以UTF-8 解码

 String userAgent = request.getHeader("User-Agent"); 
// name.getBytes("UTF-8")处理safari的乱码问题 
 byte[] bytes = userAgent.contains("MSIE") ? name.getBytes("GBK") : name.getBytes("UTF-8");                     

 // 各浏览器基本都支持ISO编码
name = new String(bytes, "ISO-8859-1");  

// 文件名外的双引号处理firefox的空格截断问题 
response.setHeader("Content-disposition", String.format("attachment; filename=\"%s\"", name));   

4262551-b16101f1d1a921bd.png

image.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值