java 下载Excel 文件名称中文乱码问题

问题:java中用poi API进行Excel文件的下载,下载操作可以执行,可是最后发现下载的文件名称若为中文,则会出现乱码。

 

解决办法:

原因:ie浏览器下自动转码格式为gbk,而火狐、chrome等浏览器下的自动转码格式为utf-8

因而,在生成下载文件名时,只需根据不同的浏览器,对文件名进行转码即可。

直接上代码:

这里只贴生成文件名的代码:

/**
     * 下载文件输出流 文件头设置
     * @param response 服务器响应
     * @param request 客户端请求
     * @param contentType 头信息
     * @param exportDto 下载实体信息
     * @return
     * @throws Exception
     */
    private static OutputStream getWriteOutputStream(HttpServletResponse response, HttpServletRequest request) throws Exception {

        response.reset();// 清空输出流
        response.setContentType("application/ms-excel;charset=utf-8");

       
        String fileName = encodeFileName("这里是你的文件名", request);

        // attachment这个代表要下载的,如果去掉就直接打开了(attachment-作为附件下载,inline-在线打开)
        // filename是文件名,另存为或者下载时,为默认的文件名
        response.addHeader("Content-Disposition", "attachment; filename="+fileName);// IE下GBK,但是FireFox下UTF-8
        return response.getOutputStream();
    }

 /**
     * @param   fileNames
     * @param   request
     * @Description: 导出文件转换文件名称编码
     */
    public static String encodeFileName(String fileNames, HttpServletRequest request) {
        String codedFilename = null;
        try {
            String agent = request.getHeader("USER-AGENT");
            if (null != agent && -1 != agent.indexOf("MSIE") || null != agent && -1 != agent.indexOf("Trident") || null != agent && -1 != agent.indexOf("Edge")) {// ie浏览器及Edge浏览器
                String name = java.net.URLEncoder.encode(fileNames, "UTF-8");
                codedFilename = name;
            } else if (null != agent && -1 != agent.indexOf("Mozilla")) {
                // 火狐,Chrome等浏览器
                codedFilename = new String(fileNames.getBytes("UTF-8"), "iso-8859-1");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return codedFilename;
    }

 

    原文作者:白不懂黑的静
    原文地址: https://blog.csdn.net/yyj108317/article/details/88793099
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞