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("文件正在被下载");
        }
}
相关推荐
古茗前端团队1 小时前
急招!前端|测试|后端|产品(名额多,速来)
前端·后端·架构
喵个咪2 小时前
Go-Wind HTTP 服务器从入门到精通
后端·http·go
hunterandroid2 小时前
Hilt 依赖注入:从手动 new 到自动装配
后端
喵个咪2 小时前
Go-Wind gRPC 服务器从入门到精通
后端·go·grpc
喵个咪2 小时前
Go-Wind GraphQL 服务器从入门到精通
后端·graphql
青青子衿悠悠我心2 小时前
Docker与Kubernetes的十年战争与融合
后端
AI小老六2 小时前
SkillOpt 架构拆解:把 Skill 文本当参数,用执行轨迹训练 Agent
后端·算法·ai编程
云技纵横2 小时前
@Transactional 到底要不要加 rollbackFor?一次数据不一致事故讲清楚
后端·面试
Csvn2 小时前
日志分析进阶 — Logwatch 与 GoAccess 实战
后端