• 【记录】实现从Linux下载下载文件(文件导出功能)并记录过程产生的BUG问题。


    前言

    导出功能的实现,主要记录总结导出过程中出现的一些问题。

    代码实现导出功能

        public R templateDown(HttpServletResponse response) {
            String fileName = "template.xlsx";
            // 清空response
            response.reset();
            response.setCharacterEncoding("UTF-8");
            response.setContentType("application/x-msdownload");
            try {
                //解决乱码
                String exportName = "导入模板.xlsx";
                String fileNameCode = URLEncoder.encode(exportName,"UTF-8");
                response.setHeader("Content-Disposition", "attachment;fileName=" + fileNameCode);
                //获取文件路径
                String fileUrl = emergencyPath;
                //获取项目在服务器上的真实路径
                fileUrl = fileUrl + File.separator + fileName;
    
                File file = new File(fileUrl);
                if (!file.exists()) {
    //                response.sendError(500, "File not found!");
                    return R.fail("模板文件不存在");
                }
                long fileLength = file.length();
                response.setHeader("Content-Length", String.valueOf(fileLength));
                BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
                BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream());
                byte[] buff = new byte[2048];
                int bytesRead;
                while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
                    bos.write(buff, 0, bytesRead);
                }
                bis.close();
                bos.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return R.success("导出成功");
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    问题总结

    1. 导出文件名、文件内容乱码问题,以下几种情况可尝试解决该问题
    • 设置参数前response清空,有些情况可通过reset()解决。
    // 清空response
    response.reset();
    
    • 1
    • 2
    • 对导出的文件名编码处理:
    String fileNameCode = URLEncoder.encode(exportName,"UTF-8");
    response.setHeader("Content-Disposition", "attachment;fileName=" + fileNameCode);
    
    
    • 1
    • 2
    • 3
    • 也是一种编码处理,和第二种方式差不多,都是对文件头设置:
    fileName = URLEncoder.encode(fileName,"utf-8");
    response.addHeader("Content-Disposition",
                        "attachment;filename=" + new String(fileName.getBytes("utf-8"),"ISO8859-1"));
    
    • 1
    • 2
    • 3
    1. 文件路径、文件名都是对的,但是通过new File(path)一直返回找不到文件。
      原因:服务器的文件名是不是中文名,如果是中文名可能会出现即使路径都写对了,仍出现文件找不到的问题。强烈建议服务器上文件名用英文!!!
  • 相关阅读:
    java毕业设计家教管理系统mybatis+源码+调试部署+系统+数据库+lw
    国产办公软件崛起,WPS发布新版本,金山系兄弟软件来助力
    Arm Neoverse 路线图再添新品,基于四项关键原则打造
    打印编译程序固件的环境信息
    Pytorch:一些常用代码
    理论和实践详解RabbitMQ死信(dead lettering)(带测试样例和分析)
    Maven高级
    java计算机毕业设计VUE技术小区车辆档案车位管理系统设计与实现源码+mysql数据库+系统+lw文档+部署
    【算法-哈希表2】快乐数 和 两数之和
    数据结构之单链表基本操作
  • 原文地址:https://blog.csdn.net/m0_55051386/article/details/132981056