膛线都磨平了 2019-07-10 01:18 采纳率: 0%
浏览 1009
已采纳

servlet 下载文件时文件名中文乱码问题一直解决不了

jsp页面通过超链标签下载文件,文件名包含中文时,下载乱码,英文和数字可以正常下载,根据网上的方法试了很多次还是解决不了,困扰一天了,现在是凌晨1点这个问题搞得我睡不着,各位老哥帮小弟看看是
哪里错了图片说明页面编码设置utf_8
图片说明下载链接

protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
           response.setCharacterEncoding("UTF-8");
        EbizCompany company = (EbizCompany) request.getSession().getAttribute("currentCompany");
        //String file = new String(request.getParameter("file").getBytes("ISO-8859-1"),"UTF-8");
        String fileName = request.getParameter("file"); //客户端传递的需要下载的文件名
        fileName = new String(fileName.getBytes("ISO8859-1"),"UTF-8");
        System.out.println("filename  "+fileName);
        //获得请求头中的User-Agent
                String agent = request.getHeader("User-Agent");
               //根据不同浏览器进行不同的编码
                 String fileNameEncoder = "";
                if (agent.contains("MSIE")) {
                 // IE浏览器
               fileNameEncoder = URLEncoder.encode(fileName, "utf-8");
                 fileNameEncoder = fileNameEncoder.replace("+", " ");
                 } else if (agent.contains("Firefox")) {
                     // 火狐浏览器
                    BASE64Encoder base64Encoder = new BASE64Encoder();
                    fileNameEncoder = "=?utf-8?B?" + base64Encoder.encode(fileName.getBytes("utf-8")) + "?=";
                } else {
                    // 其它浏览器
                     fileNameEncoder = URLEncoder.encode(fileName, "utf-8");                
             }
                //客户端通过文件的MIME区分下载的文件的类型
                response.setContentType(this.getServletContext().getMimeType(fileName));
                 //告诉客户端不要直接解析该文件,而是以附件的形式打开(下载)            客户端默认对名字进行解码
                response.setHeader("Content-Disposition", "attachment;filename=" + fileNameEncoder);
        String time=Integer.toString(GeneralMethod.getYear(System.currentTimeMillis()))+"\\"+Integer.toString(GeneralMethod.getMonth(System.currentTimeMillis()));
        String path = Constant.FilePath + "\\" + company.companyName+"\\"+time+"\\"+fileName;
        FileInputStream fis = new FileInputStream(path);
        response.setContentType("multipart/form-data");  
        ServletOutputStream out = response.getOutputStream();
        byte[] bt = new byte[1024];
        int length = 0;
        while((length=fis.read(bt))!=-1){
            out.write(bt,0,length);
        }
        out.close();

        }
```  ![图片说明](https://img-ask.csdn.net/upload/201907/10/1562692854_226734.png)
  • 写回答

2条回答 默认 最新

  • 萧萧风 2019-07-10 10:14
    关注

    fileName = new String(fileName.getBytes("ISO8859-1"),"UTF-8"); //这一步注释掉试试

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 求.net core 几款免费的pdf编辑器
  • ¥20 SQL server表计算问题
  • ¥15 C# P/Invoke的效率问题
  • ¥20 thinkphp适配人大金仓问题
  • ¥20 Oracle替换.dbf文件后无法连接,如何解决?(相关搜索:数据库|死循环)
  • ¥15 数据库数据成问号了,前台查询正常,数据库查询是?号
  • ¥15 算法使用了tf-idf,用手肘图确定k值确定不了,第四轮廓系数又太小才有0.006088746097507285,如何解决?(相关搜索:数据处理)
  • ¥15 彩灯控制电路,会的加我QQ1482956179
  • ¥200 相机拍直接转存到电脑上 立拍立穿无线局域网传
  • ¥15 (关键词-电路设计)