Java后端向前端返回文件流实现下载功能

 更新时间:2023年12月21日 14:34:30   作者:技术小羊  
后端可以使用Java中servlet提供的HttpServletResponse,核心步骤是要设置响应的数据类型,设置为某一类文件类型或二进制格式,以及响应头,然后用ServletOutputStream将文件以流的形式发送到前端,本文介绍Java后端向前端返回文件流实现下载功能,感兴趣的朋友一起看看吧

前端实现文件下载功能有多种方法,这里就不一一介绍,这里只介绍使用文件流下载的实现方法。

既然是文件流那就肯定需要给前端返回一堆二进制编码,作为后端就可以返回一个OutPutStream

后端可以使用Java中servlet提供的HttpServletResponse,核心步骤是要设置响应的数据类型,设置为某一类文件类型或二进制格式,以及响应头,然后用ServletOutputStream将文件以流的形式发送到前端。

直接上代码

response.setCharacterEncoding("UTF-8");
response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-Disposition", "attachment;filename=example.xls");

解释一下

  • 首先设置响应数据类型,你要下载什么文件就设置什么类型,如果你不知道文件是什么类型但可以肯定他不是文本文件,那就用下面的application/octet-stream表示,这样浏览器就知道这是一些二进制数据,就不会对其解析了。

  • 其次是设置响应头:

其次是设置响应头:

attachment: 表示响应内容应该被当作附件处理,会触发浏览器下载行为。

filename:参数指定下载文件的名称。上述代码则会让浏览器下载一个example.xls的文件。

这里给大家放一个链接,里面有常见的MIME类型,常见 MIME 类型列表 例如下图,png类型,pdf,ppt等等。

然后就是用流的形式发送给前端

ServletOutputStream outputStream = response.getOutputStream();
checkInfo.write(outputStream);
outputStream.flush();

这样后端就完成了把一个文件以文件流的形式传递给前端,前端发起请求就会触发浏览器的下载行为。

下面是完整代码

@GetMapping("/output/{classId}/{checkName}")
    public void checkToExcel(@PathVariable String checkName, @PathVariable String classId, HttpServletResponse response) {
        HSSFWorkbook checkInfo = checkExcelService.getCheckInfo(classId, checkName);
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("UTF-8");
        response.setHeader("Content-Disposition", "attachment;filename=" + checkName + "签到统计表.xls");
        try {
            ServletOutputStream outputStream = response.getOutputStream();
            checkInfo.write(outputStream);
            outputStream.flush();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

不知道有没有朋友像我一样,方法的返回值写的是流(例如ByteArrayOutputStream)这么写就错了

我之前在写这个程序时就是向前端返回一个流,结果下载的文件始终格式错误,浏览器收到的响应数据类型也一直是json,原因就在于没有使用response发送流,所以一定要使用response.getOutputStream()获取流,然后再去flush,这样前端才真正收到的是二进制文件流。

到此这篇关于Java后端向前端返回文件流——实现下载功能!的文章就介绍到这了,更多相关Java后端向前端返回文件流内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java SpringBoot操作Redis

    Java SpringBoot操作Redis

    这篇文章主要介绍了SpringBoot如何操作Redis,文章中有详细的代码示例,有一定的参考价值,感兴趣的同学可以参考阅读
    2023-04-04
  • java线程池ThreadPoolExecutor的八种拒绝策略示例详解

    java线程池ThreadPoolExecutor的八种拒绝策略示例详解

    ThreadPoolExecutor是一个典型的缓存池化设计的产物,因为池子有大小,当池子体积不够承载时,就涉及到拒绝策略。JDK中已预设了 4 种线程池拒绝策略,下面结合场景详细聊聊这些策略的使用场景以及还能扩展哪些拒绝策略
    2021-11-11
  • java开发分布式服务框架Dubbo调用过程

    java开发分布式服务框架Dubbo调用过程

    这篇文章主要为大家介绍了java开发分布式服务框架Dubbo调用过程,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2021-11-11
  • Java代码轻松实现将HTML转成图片

    Java代码轻松实现将HTML转成图片

    HTML 转图片并非小众场景,在实际开发中相当常见,这篇文章就来和大家详细介绍一下如何通过Java代码轻松实现将HTML转成图片,感兴趣的小伙伴可以了解下
    2026-04-04
  • Java通过JNI调用C++动态库的完整流程详解

    Java通过JNI调用C++动态库的完整流程详解

    JNI(Java Native Interface),是实现Java/Kotlin与C/C++语言之间交互的桥梁,本文主要为大家介绍了Java通过JNI调用C++动态库的完整流程,需要的可以参考下
    2025-04-04
  • Java中树的存储结构实现示例代码

    Java中树的存储结构实现示例代码

    本篇文章主要介绍了Java中树的存储结构实现示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • servlet基础知识_动力节点Java学院整理

    servlet基础知识_动力节点Java学院整理

    这篇文章主要为大家详细介绍了servlet基础的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • SpringBoot整合ShardingSphere的示例代码

    SpringBoot整合ShardingSphere的示例代码

    本文主要介绍了SpringBoot整合ShardingSphere的示例代码,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • SpringBoot基于拦截器与ThreadLocal实现用户登录校验

    SpringBoot基于拦截器与ThreadLocal实现用户登录校验

    本文介绍了一种在SpringBoot中实现统一登录校验和上下文共享的解决方案,通过使用拦截器、ThreadLocal和自定义工具类,实现了在请求处理过程中优雅地获取当前登录用户信息,并且避免了在每个Controller方法中重复编写校验代码,需要的朋友可以参考下
    2025-12-12
  • Java数据机构中关于并查集的详解

    Java数据机构中关于并查集的详解

    并查集是一种树型的数据结构,用于处理一些不相交集合的合并及查询问题,如果你还不了解并查集,请看接下来的文章,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值
    2021-09-09

最新评论