springboot 文件下载

在springboot中,执行如下代码实现文件下载

复制代码
    @GetMapping("/file/download/test")
    public void Download(HttpServletResponse response){
        try {
            String path = "XXXXXXXXXXXX";//文件路径
            File file = new File(path);
            // 读到流中
            InputStream inputStream = Files.newInputStream(Paths.get(path));// 文件的存放路径
            response.reset();
            response.setContentType("application/octet-stream");
            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(file.getName(), "UTF-8"));
            response.setContentLengthLong(file.length());
            ServletOutputStream outputStream = response.getOutputStream();
            byte[] b = new byte[1024];
            int len;
            //从输入流中读取一定数量的字节,并将其存储在缓冲区字节数组中,读到末尾返回-1
            while ((len = inputStream.read(b)) > 0) {
                outputStream.write(b, 0, len);
            }
            inputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
}

访问地址,执行下载时,会出错:

No converter for class cn.hutool.core.io.resource.InputStreamResource with preset Content-Type 'application/octet-stream'

对于具有预设内容类型"application/octet流"的class cn.hutool.core.io.resource.InputStreamResource,没有转换器

当然,在出现错误时,我在想是不是application/octet-stream的问题,也使用过multipart/form-data,但也是一样的结果。

application/octet-stream和multipart/form-data的区别:

或者是这个错误:

org.apache.catalina.connector.ClientAbortException: java.io.IOException: 你的主机中的软件中止了一个已建立的连接。

但是即使会报错,文件还是能完整的下载下来。

找了很久的解决方法,但是没有发现什么正确的答案。

这里贴出来一些别人的解答,供参考思考,本人试过但没成功:

Spring Boot 异常:HttpMessageNotWritableException: No Converter for class ... With Preset Content-Type - spring 中文网

No converter for XXX with preset Content-Type 'application/octet-stream;charset=UTF-8'_unkonwncontenttypeexception-CSDN博客

下载/导出问题(统一返回):No converter for xxx with preset Content-Type 'application/octet-stream;charset=UTF-8-CSDN博客

这里给出帖主的解决方法:

既然这里访问文件能正确的完成下载,我们就让不进行异常操作:

复制代码
    @GetMapping("/file/download/test")
    public void Download(HttpServletResponse response){
        try {
            String path = "XXXXXXXXXXXX";//文件路径
            File file = new File(path);
            // 读到流中
            InputStream inputStream = Files.newInputStream(Paths.get(path));// 文件的存放路径
            response.reset();
            response.setContentType("application/octet-stream");
            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(file.getName(), "UTF-8"));
            response.setContentLengthLong(file.length());
            ServletOutputStream outputStream = response.getOutputStream();
            byte[] b = new byte[1024];
            int len;
            //从输入流中读取一定数量的字节,并将其存储在缓冲区字节数组中,读到末尾返回-1
            while ((len = inputStream.read(b)) > 0) {
                outputStream.write(b, 0, len);
            }
            inputStream.close();
        } catch (IOException e) {
            System.out.println("文件正在被下载");
        }
}
相关推荐
小码哥_常5 小时前
一套自己部署的 IM,客户端是同一份 Flutter
前端·后端
学长毕设8 小时前
基于SpringBoot的实验室资产管理系统
java·spring boot·后端
zzu123zsw9 小时前
从臃肿的模板调用到声明式契约:深入 UniHttp 动态代理与多渠道生命周期扩展
java·spring boot·microsoft·unihttp
源码集结号10 小时前
云诊所门诊系统源码,基于SpringBoot+Vue.js架构,支持多租户设计与Docker容器化部署
java·spring boot·源码·医院信息系统·门诊系统·诊所系统
努力的小雨10 小时前
给 AI 眼镜开发应用有多难?我从零做了一个陪练,还上架了
后端
论文复现现场10 小时前
WRF、FEA 能用 L40S 加速吗?求解器检查、断点恢复与长期运行
java·数据库·算法·wrf·有限元分析·gpu计算·断点续算
啃瓜子的松鼠10 小时前
泛微OAe9-后端二开异步调用
java
秋天的怀念_David11 小时前
第二十一夜 · 数字黑洞与西西弗斯的惩罚
java·程序人生·算法
excel11 小时前
双 Token 与前端使用 Crypto 公私钥鉴权换 Token,哪种方案更好?
前端·后端
外收内放11 小时前
Python基础语法练习题(73)
java·前端·python