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("文件正在被下载");
        }
}
相关推荐
QC班长9 小时前
Maven公司私库配置踩坑点
java·服务器·maven·intellij-idea
Makoto_Kimur9 小时前
java开发面试-AI Coding速成
java·开发语言
wuqingshun31415910 小时前
说说mybatis的缓存机制
java·缓存·mybatis
空中海10 小时前
Kubernetes 生产实践、可观测性与扩展入门
java·贪心算法·kubernetes
Devin~Y10 小时前
大厂Java面试实录:Spring Boot/Cloud、Kafka、Redis、K8s 与 Spring AI(RAG/Agent)三轮连环问
java·spring boot·redis·mysql·spring cloud·kafka·kubernetes
bLEd RING10 小时前
SpringBoot3.3.0集成Knife4j4.5.0实战
java
小松加哲11 小时前
Spring MVC 核心原理全解析
java·spring·mvc
GetcharZp11 小时前
比 Zap 还要快?Go 社区高性能日志神器 Zerolog 落地实践指南
后端
Ulyanov11 小时前
《PySide6 GUI开发指南:QML核心与实践》 第二篇:QML语法精要——构建声明式UI的基础
java·开发语言·javascript·python·ui·gui·雷达电子对抗系统仿真
码界筑梦坊11 小时前
357-基于Java的大型商场应急预案管理系统
java·开发语言·毕业设计·知识分享