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中对HashMap的put过程解读

    java中对HashMap的put过程解读

    这篇文章主要介绍了java中对HashMap的put过程解读,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • MybatisPlus实现逻辑删除功能

    MybatisPlus实现逻辑删除功能

    这篇文章主要介绍了MybatisPlus实现逻辑删除功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • Java导出oracle表结构实例详解

    Java导出oracle表结构实例详解

    这篇文章主要介绍了 Java导出oracle表结构实例详解的相关资料,需要的朋友可以参考下
    2017-03-03
  • Java中调用第三方接口的详细代码示例

    Java中调用第三方接口的详细代码示例

    这篇文章主要介绍了Java中调用第三方接口的详细代码示例,文章总结了多种Java进行HTTP请求的方法,每种方法都有其特点和适用场景,从原生到封装,再到声明式客户端,满足了不同复杂度的HTTP请求需求,需要的朋友可以参考下
    2024-12-12
  • spring boot 如何指定profile启动

    spring boot 如何指定profile启动

    这篇文章主要介绍了spring boot 如何指定profile启动的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • java中continue和break区别详细解析

    java中continue和break区别详细解析

    break和continue都是跳转语句,它们将程序的控制权转移到程序的另一部分,下面这篇文章主要给大家介绍了关于java中continue和break区别的相关资料,需要的朋友可以参考下
    2022-11-11
  • Java使用Deque实现堆栈的方法

    Java使用Deque实现堆栈的方法

    这篇文章主要介绍了Java使用Deque实现堆栈的方法,实例分析了java简单实现堆栈的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • 详解MySQL事务日志undo log

    详解MySQL事务日志undo log

    众所周知,事务的一大特点是原子性,即同一事务的SQL要同时成功或者失败,那大家有没有想过在MySQL的innoDB存储引擎中是如何保证这样的原子性操作的,接下来就带大家一探究竟,感兴趣的小伙伴和小编一起来探讨吧
    2023-07-07
  • mybatis查询语句揭秘之封装数据

    mybatis查询语句揭秘之封装数据

    这篇文章主要给大家介绍了关于mybatis查询语句揭秘之封装数据的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用mybatis具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-04-04
  • 详解Java中对象序列化与反序列化

    详解Java中对象序列化与反序列化

    这篇文章主要为大家详细介绍了Java中对象序列化与反序列化,感兴趣的小伙伴们可以参考一下
    2016-02-02

最新评论