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

前言

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

代码实现导出功能

java 复制代码
    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. 导出文件名、文件内容乱码问题,以下几种情况可尝试解决该问题
  • 设置参数前response清空,有些情况可通过reset()解决。
java 复制代码
// 清空response
response.reset();
  • 对导出的文件名编码处理:
java 复制代码
String fileNameCode = URLEncoder.encode(exportName,"UTF-8");
response.setHeader("Content-Disposition", "attachment;fileName=" + fileNameCode);
  • 也是一种编码处理,和第二种方式差不多,都是对文件头设置:
java 复制代码
fileName = URLEncoder.encode(fileName,"utf-8");
response.addHeader("Content-Disposition",
                    "attachment;filename=" + new String(fileName.getBytes("utf-8"),"ISO8859-1"));
  1. 文件路径、文件名都是对的,但是通过new File(path)一直返回找不到文件。
    原因:服务器的文件名是不是中文名,如果是中文名可能会出现即使路径都写对了,仍出现文件找不到的问题。强烈建议服务器上文件名用英文!!!
相关推荐
前行的小黑炭35 分钟前
设计模式:为什么使用模板设计模式(不相同的步骤进行抽取,使用不同的子类实现)减少重复代码,让代码更好维护。
android·java·kotlin
Java技术小馆41 分钟前
如何设计一个本地缓存
java·面试·架构
XuanXu2 小时前
Java AQS原理以及应用
java
风象南4 小时前
SpringBoot中6种自定义starter开发方法
java·spring boot·后端
mghio13 小时前
Dubbo 中的集群容错
java·微服务·dubbo
咖啡教室18 小时前
java日常开发笔记和开发问题记录
java
咖啡教室18 小时前
java练习项目记录笔记
java
鱼樱前端19 小时前
maven的基础安装和使用--mac/window版本
java·后端
RainbowSea19 小时前
6. RabbitMQ 死信队列的详细操作编写
java·消息队列·rabbitmq