【记录】实现从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)一直返回找不到文件。
    原因:服务器的文件名是不是中文名,如果是中文名可能会出现即使路径都写对了,仍出现文件找不到的问题。强烈建议服务器上文件名用英文!!!
相关推荐
一嘴一个橘子18 分钟前
spring-aop 的 基础使用 - 4 - 环绕通知 @Around
java
小毅&Nora35 分钟前
【Java线程安全实战】⑨ CompletableFuture的高级用法:从基础到高阶,结合虚拟线程
java·线程安全·虚拟线程
码农小韩35 分钟前
基于Linux的C++学习——动态数组容器vector
linux·c语言·开发语言·数据结构·c++·单片机·学习
冰冰菜的扣jio35 分钟前
Redis缓存中三大问题——穿透、击穿、雪崩
java·redis·缓存
Joren的学习记录39 分钟前
【Linux运维大神系列】Kubernetes详解3(kubeadm部署k8s1.23高可用集群)
linux·运维·kubernetes
小璐猪头1 小时前
专为 Spring Boot 设计的 Elasticsearch 日志收集 Starter
java
代码游侠1 小时前
应用——智能配电箱监控系统
linux·服务器·数据库·笔记·算法·sqlite
2501_933513041 小时前
Linux下载离线rpm和依赖包的方法
linux·运维·服务器
ps酷教程1 小时前
HttpPostRequestDecoder源码浅析
java·http·netty
闲人编程1 小时前
消息通知系统实现:构建高可用、可扩展的企业级通知服务
java·服务器·网络·python·消息队列·异步处理·分发器