struts2文档下载支持Chrome safari FF IE Opera浏览器

最近在做文档的下载,真可谓一波三折,浏览器兼容问题是最让人头疼的问题,包括中文乱码以及文件名中含有空格等。废话不多说立马贴code。。。。。。。

环境=> 服务器:linux(tomcat)  平台:Struts2+Spring+hibernate

// 得到请求下载的文件名  
        String fname = ServletActionContext.getRequest().getParameter("name");
        String userAgent = ServletActionContext.getRequest().getHeader("User-Agent");   //取得浏览器信息串进行分析  
        try{  
             /*
             * 对fname参数进行UTF-8解码,注意:实际进行UTF-8解码时会使用本地编码,本机为GBK。
             * 这里使用request.setCharacterEncoding解码无效.
             * 只有解码了getDownloadFile()方法才能在下载目录下正确找到请求的文件
             */
            if (userAgent != null) {  
                userAgent = userAgent.toLowerCase();  
                 // IE浏览器,只能采用URLEncoder编码  
               if (userAgent.indexOf("msie") != -1){
                   fname = new String(fname.getBytes("GBK"),"ISO8859-1");
                   System.err.println("IE............");
               }else if (userAgent.indexOf("opera") != -1){
                   fname = URLEncoder.encode(fname,"UTF-8");
                   //编码后空格会变成”+“ 空格在UTF-8编码中为 %20
                   fname = StringUtils.replace(fname, "+", "%20");
                   System.err.println("opera............");
               }else if (userAgent.indexOf("applewebkit") != -1 && userAgent.indexOf("chrome") != -1){// Chrome浏览器,只能采用   MimeUtility编码或ISO编码的中文输出   
                   //mozilla/5.0 (windows nt 6.1) applewebkit/535.1 (khtml, like gecko) chrome/14.0.835.163 safari/535.1
                   fname = new String(fname.getBytes("GBK"),"ISO8859-1");
                   System.err.println("Chrome............");
               }else if (userAgent.indexOf("safari") != -1 && userAgent.indexOf("chrome") == -1){
                   //mozilla/5.0 (windows nt 6.1) applewebkit/534.52.7 (khtml, like gecko) version/5.1.2 safari/534.52.7
                   fname = new  String(fname.getBytes( "UTF-8" ), "ISO-8859-1" );
                   System.err.println("safari............");  
               }else if (userAgent.indexOf("mozilla") != -1){// FireFox浏览器,可以使用MimeUtility或filename*或ISO编码的中文输出   
                   String chinese = "[\u4e00-\u9fa5]";
                   Pattern pat = Pattern.compile(chinese);
                   Matcher matcher = pat.matcher(fname);     

                   if (matcher.find())

                 //[判断文件名中是否含有中文 如果有就采用MimeUtility

                       fname = MimeUtility.encodeWord(fname);

                    else

                 //如果没有中文 就采用加密的方式 (该方法主要针对FF中文件名中有空格的问题)

                       fname = "=?UTF-8?B?" + (new String(Base64.encodeBase64(fname.getBytes("UTF-8")))) + "?=";  
                   System.err.println("FireFox............");  
                       }

               }

以上代码仅供参考,不一定放在什么地方都可用.在此之前俺也在网上浏览了大量code,但很多都不管用.如果大家还有其他的方式来实现,希望多多交流......


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值