整理java文件下载(中文乱码、火狐浏览器乱码、空格变+号、文件名包含空格时文件名可能显示不全等问题)

javaweb 同时被 2 个专栏收录
1 篇文章 0 订阅
1 篇文章 0 订阅

首先感谢网上各路大仙提供的资料:(参考如下)
Java文件下载处理中文名(使用URLEncoder编码及空格变+解决)

FIREFOX 下载中文文件名出现乱码的java解决方案

用火狐浏览器下载中文文件名的文件乱码及其解决

解决attachment; filename含空格时显示不完全的问题

1.一般中文乱码处理方式
采用URLEncoder.encode(fileName, "UTF-8")处理中文名字;
但是这样的话,不是通用的,火狐浏览器就不行了。需要单独处理

2.火狐浏览器下载中文文件名的文件乱码及其解决
.火狐浏览器下载中文文件名的文件乱码及其解决
采用 new String(fileName.getBytes("GB2312"),"ISO-8859-1")处理中文名字;

2.空格变+号
空格变+号
%20是空格在UTF-8下的编码;
只需要在URLEncoder.encode(fileName, "UTF-8")替换+号为%20;

fileName = fileName.Replace("+", "%20");  //encode后替换  解决空格问题

3.文件名包含空格时文件名显示不全
我开始遇到这问题了,后来不知道怎么测试想截图的时候,加不加这个双引号包含都没问题;反正我还是加了,有备无患;

response.setHeader("Content-Disposition", "attachment;filename=\""+ filenamedisplay  +"\"");//将文件名用 双引号包含,否则带空格的文件名,显示不完全

贴个部分代码(仅供参考)

// 1.获取要下载的文件的绝对路径
        String filepath = "";
        if (fil_fileindex != null) {
            filepath = filepath + fileserverurl;
        }
// 2.获取要下载的文件名
        String fileName = fil_fileindex.getFilename();
        int fileSize = Integer.parseInt(fil_fileindex.getFilesize());
        response.reset();  
        // 设置为下载application/x-download  
        //response.setContentType("application/x-download charset=UTF-8");
        if ("FF".equals(getBrowser(request))) {  
            // 针对火狐浏览器处理方式不一样了  
            fileName = new String(fileName.getBytes("GB2312"), "ISO-8859-1");  
        }else{
            fileName = URLEncoder.encode(fileName, "UTF-8");//encode解决中文乱码
            fileName = fileName.replace("+", "%20");//encode后替换  解决空格问题
        } 
        // 3.设置Content-Disposition响应头控制浏览器弹出保存框,若没有此句则浏览器会直接打开并显示文件。中文名要经过URLEncoder.encode编码,否则虽然客户端能下载但显示的名字是乱码
        response.setHeader("Content-Disposition", "attachment;filename=\""+ fileName +"\"");//将文件名用 双引号包含,否则带空格的文件名,显示不完全
        response.setContentLength(fileSize);
        // 4.获取要下载的文件输入流、输出流
        InputStream in = null;
        OutputStream out = null;
        try {
            in = getInputStreamByPath(filepath);
            int len = 0;
            // 5.创建数据缓冲区
            byte[] buffer = new byte[1024];
            // 6.通过response对象获取OutputStream流
            out = response.getOutputStream();
            // 7.将FileInputStream流写入到buffer缓冲区
            while ((len = in.read(buffer)) > 0) {
                // 8.使用OutputStream将缓冲区的数据输出到客户端浏览器
                out.write(buffer, 0, len);
            }
            out.flush();
        } catch (IOException e) {
            response.reset();//重置响应头信息
            request.setCharacterEncoding("UTF-8");
            response.setHeader("Pragma", "No-cache");
            response.setHeader("Cache-Control", "no-cache");
            response.setDateHeader("Expires", 0L);
            response.getWriter().print("<script>alert(decodeURIComponent('" + URLEncoder.encode("没有找到该文件,已被删除!", "UTF-8") + "'));</script>");
        }finally{
            if(out != null){
                out.close();
            }
            if(in != null){
                in.close();
            }
        }
     /** 
     * 通过url返回输入流  
     * @param url 
     * @return 
     * @throws IOException 
     */  
    private InputStream getInputStreamByPath(String path) throws IOException{  
        URL url = null;  
        InputStream is =null;  
        try {  
            url = new URL(path);  
        } catch (MalformedURLException e) {  
            e.printStackTrace();  
        } 

        HttpURLConnection conn = (HttpURLConnection) url.openConnection();//利用HttpURLConnection对象,我们可以从网络中获取网页数据. 
        //设置超时间为3秒  
        conn.setConnectTimeout(3*1000);  
        //防止屏蔽程序抓取而返回403错误  
        conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");  

        // 设置是否向conn输出,因为这个是post请求,参数要放在http正文内,因此需要设为true, 默认情况下是false;   
        conn.setDoOutput(true);
        // 设置是否从conn读入,默认情况下是true;
        conn.setDoInput(true); 
        // Post 请求不能使用缓存   
        conn.setUseCaches(false);
        // 设定传送的内容类型是可序列化的java对象(如果不设此项,在传送序列化对象时,当WEB服务默认的不是这种类型时可能抛java.io.EOFException)   
        conn.setRequestProperty("Content-type", "application/x-java-serialized-object");   
        // 设定请求的方法为"POST",默认是GET   
        conn.setRequestMethod("POST");
        // 连接,从上述url.openConnection()至此的配置必须要在connect之前完成,   
        conn.connect();  
        is = conn.getInputStream(); //得到网络返回的输入流  

        return is;  
    }
    /**
     *  以下为服务器端判断客户端浏览器类型的方法  
     * @param request
     * @return
     */
    private String getBrowser(HttpServletRequest request) {  
        String UserAgent = request.getHeader("USER-AGENT").toLowerCase();  
        if (UserAgent != null) {  
             if (UserAgent.indexOf("msie") != -1)  
                return "IE";  
            if (UserAgent.indexOf("firefox") != -1)  
                return "FF";  
            if (UserAgent.indexOf("safari") != -1)  
                return "SF";  
        }  
        return null;  
    } 
  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值