Servlet下载文件的学习心得

本文介绍了一种解决不同浏览器(如IE与Firefox)在下载文件时出现的文件名乱码问题的方法。通过使用Java Servlet API,根据浏览器类型对文件名进行适当的编码,确保了跨浏览器的一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

下载文件无非就是IO流的读写操作,但写是向浏览器上写,所以用HttpServletResponse对象来获取输出流,并且设置响应头Content-Disposition。而IE与FireFox的默认不同编码,显示下载文件名出现乱码,所以先要判断是哪个浏览器,然后针对性的进行编码。
编写工具类,判断是什么浏览器

public class HttpUtils {
    //对应不同版本的IE浏览器的一些关键字
    private static String [] IEBrowserSignals = {"MSIE","Trident","Edge"};
    public static boolean isIEBrowser(HttpServletRequest request){
        String userAgent = request.getHeader("User-Agent");  
        for(String signal : IEBrowserSignals){
            if(userAgent.contains(signal)){
                return true;
            }
        }
        return false;
    }

}

编写主体

public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        //获取文件的盘符路径
        String path = getServletContext().getRealPath("/image/iso美女图片.jpg");
        //获取filename
        int index = path.lastIndexOf("\\");
        String filename = path.substring(index+1);
        //根据不同的浏览器对filename进行编码
        boolean isIEBrowser = HttpUtils.isIEBrowser(request);
        if(isIEBrowser){
            filename = URLEncoder.encode(filename, "UTF-8");
        }else{
            filename = new String(filename.getBytes("UTF-8"),"ISO-8859-1");
        }
        //设置头信息,filename前后加引号是为了火狐浏览器中英同时出现不出错。
        response.setHeader("Content-Disposition", "attachment;filename=\""+filename+"\"");
        //获取io流,并频繁读写操作,结束后关闭流资源
        InputStream in = new FileInputStream(path);
        OutputStream out = response.getOutputStream();
        byte [] buf = new byte[1024];
        int len = 0;
        while((len = in.read(buf))!=-1){
            out.write(buf, 0, len);
        }
        in.close();
    }

参考:http://blog.youkuaiyun.com/mym43210/article/details/48523135

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值