java response下载文件 文件名乱码

java response下载文件 文件名乱码

摘要

java response下载文件 文件名乱码

下载文件的代码

private void resp(HttpServletRequest request, HttpServletResponse response, String src) {
        try {
            String filePath = src;// 文件路径
            String filename = new File(filePath).getName();// 文件名称

            log.info("下载的文件名为=" + filename);

            File file = new File(filePath);
            //判断文件是否存在
            if (!file.exists()) {
                return;
            }

            String userAgent = request.getHeader("User-Agent");
            String new_filename = URLEncoder.encode(filename, "UTF8");
            new_filename = StringUtils.replace(new_filename, "+", "%20");
            // 如果没有UA,则默认使用IE的方式进行编码,因为毕竟IE还是占多数的
            String rtn = "filename=\"" + new_filename + "\"";
            if (userAgent != null) {
                userAgent = userAgent.toLowerCase();
                // IE浏览器,只能采用URLEncoder编码
                if (userAgent.indexOf("msie") != -1) {
                    rtn = "filename=\"" + new_filename + "\"";
                }
                // Opera浏览器只能采用filename*
                else if (userAgent.indexOf("opera") != -1) {
                    rtn = "filename*=UTF-8''" + new_filename;
                }
                // Safari浏览器,只能采用ISO编码的中文输出
                else if (userAgent.indexOf("safari") != -1) {
                    rtn = "filename=\"" + new String(filename.getBytes("UTF-8"), "ISO8859-1") + "\"";
                }
                // Chrome浏览器,只能采用MimeUtility编码或ISO编码的中文输出
                else if (userAgent.indexOf("applewebkit") != -1) {
                    new_filename = MimeUtility.encodeText(filename, "UTF8", "B");
                    rtn = "filename=\"" + new_filename + "\"";
                }
                // FireFox浏览器,可以使用MimeUtility或filename*或ISO编码的中文输出
                else if (userAgent.indexOf("mozilla") != -1) {
                    rtn = "filename*=UTF-8''" + new_filename;
                }
            }

            //判断文件类型
            String mimeType = URLConnection.guessContentTypeFromName(file.getName());
            if (mimeType == null) {
                mimeType = "application/octet-stream";
            }
            response.setContentType(mimeType);

            //设置文件响应大小
            response.setContentLengthLong(file.length());
            //设置Content-Disposition响应头,一方面可以指定下载的文件名,另一方面可以引导浏览器弹出文件下载窗口
            response.setHeader("Content-Disposition", "attachment;" + rtn);

            //文件下载
            InputStream in = new BufferedInputStream(new FileInputStream(file));
            FileCopyUtils.copy(in, response.getOutputStream());
            response.flushBuffer();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

参考

参考链接 http://java-xp.iteye.com/blog/903048

上面的实际情况是 只有 QQ旋风,chrome浏览器能正常显示文件名。
IDM,IE11都不行,还有待研究啊。

另外记录下user-agent

IDM
Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko

QQ旋风
Mozilla/4.0 (compatible; MSIE 9.11; Windows NT 6.1; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)

chrome 56
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36

IE11
Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko