下载文件时文件名是中文,文件名丢失或者乱码的问题

Posted qf123

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了下载文件时文件名是中文,文件名丢失或者乱码的问题相关的知识,希望对你有一定的参考价值。

技术分享图片

 

技术分享图片

解决方案

  针对不同浏览器类型,对文件名字做编码处理 Firefox (Base64) ;IE、Chrome ... 使用的是URLEncoder

public class DownloadServlet2 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取文件在tomcat下的路径
        String path = getServletContext().getRealPath("download/测试文档.txt");

        String fileName = "测试文档.txt";
        String clientType = req.getHeader("User-Agent");
        System.out.println(clientType);
        if(clientType.contains("Firefox")){
            fileName = base64EncodeFileName(fileName);
        }else{
            //IE ,或者  Chrome (谷歌浏览器) ,
            //对中文的名字进行编码处理
            fileName = URLEncoder.encode(fileName,"UTF-8");
        }
        //让浏览器收到这份资源的时候, 以下载的方式提醒用户,而不是直接展示
        resp.setHeader("Content-Disposition", "attachment; filename="+fileName);
        
        //转化成输入流
        InputStream is = new FileInputStream(path);
        OutputStream os = resp.getOutputStream();
        
        int len = 0;
        byte[] bts = new byte[1024];
        while ((len = is.read(bts)) != -1) {
            os.write(bts, 0, len);
        }
        os.close();
        is.close();
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }

    public String base64EncodeFileName(String fileName) {
        BASE64Encoder base64Encoder = new BASE64Encoder();
        try {
            return "=?UTF-8?B?"
                    + new String(base64Encoder.encode(fileName
                            .getBytes("UTF-8"))) + "?=";
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }
}

技术分享图片

 

以上是关于下载文件时文件名是中文,文件名丢失或者乱码的问题的主要内容,如果未能解决你的问题,请参考以下文章

excel内容成乱码,怎么恢复

当下载文件时,会出现文件名乱码(文件名中有中文)

Linux下 ZIP 到 Windows 下文件名乱码

为啥电脑下载的东西文件名都是乱码

Struts2文件下载中文名乱码

如何解决linux上有中文命名的文件名压缩后下载到windows上再解压出来都是乱码?