首页 > 编程语言 >Java后端向前端返回文件流——实现下载功能

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

时间:2023-08-28 23:46:19浏览次数:50  
标签:文件 outputStream Java 后端 前端 浏览器 response 下载

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

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

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

直接上代码

response.setCharacterEncoding("UTF-8");//统一编码,utf-8
response.setContentType("application/vnd.ms-excel");//这是xls,旧excel文件类型
//response.setContentType("application/octet-stream");//一种通用的二进制数据流
response.setHeader("Content-Disposition", "attachment;filename=example.xls");//告诉浏览器将响应内容当作附件进行处理,从而触发文件下载。

解释一下

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

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

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

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

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

ServletOutputStream outputStream = response.getOutputStream();
checkInfo.write(outputStream);//checkInfo是我写的一个方法返回值,其本身是poi包下的HSSFWorkbook类型,读者不必在意。
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);
        }
    }

 

标签:文件,outputStream,Java,后端,前端,浏览器,response,下载
From: https://www.cnblogs.com/wanghycoder/p/17659442.html

相关文章

  • Springboot——后端的一些配置(大部分都用得到)
    <repositories><repository><id>nexus-aliyun</id><name>nexus-aliyun</name><url>http://maven.aliyun.com/nexus/content/groups/public/</url><rele......
  • Java - ReentrantLock锁分析
    Java-JUC核心类AbstractQueuedSynchronizer(AQS)底层实现  一. AQS内部结构介绍JUC是Java中一个包  java.util.concurrent 。在这个包下,基本存放了Java中一些有关并发的类,包括并发工具,并发集合,锁等。AQS(抽象队列同步器)是JUC下的一个基础类,大多数的并发工具都是基于......
  • XXX has been compiled by a more recent version of the Java Runtime (class file v
    maven版本未指定导致编译失败问题Executiondefaultofgoalorg.springframework.boot:spring-boot-maven-plugin:3.1.3:repackagefailed:Unabletoloadthemojo'repackage'intheplugin'org.springframework.boot:spring-boot-maven-plugin:3.1.3'dueto......
  • java基础-运算符--day03
    目录1.算数运算符2.+号3.++4.=赋值操作5.关系运算6.逻辑运算7.三元运算8位运算1.算数运算符/处以%取余publicclassTestOper01{ publicstaticvoidmain(String[]args){ System.out.println(13/5);//结果为2 System.out.println(13%5);//结果为3 ......
  • 笔记-《深入理解java虚拟机-JVM高级特性与最佳实践》
    想深入了解虚拟机相关知识,所以买此书学习,记录笔记,用于后续复习查看本文内容基本摘抄自《深入理解java虚拟机-JVM高级特性与最佳实践》,以供复习之用,没有多少参考价值。想要更详细了解请参考原书。本书是第二版。基于jdk1.7的,1.7中新增了G1收集器。第一部分走近Java  ......
  • Java 8 新特性
    Java8新特性Java8新特性主要是函数式编程!Java8新增了非常多的特性,我们主要讨论以下几个:Lambda表达式−Lambda允许把函数作为一个方法的参数(函数作为参数传递到方法中)。方法引用−方法引用提供了非常有用的语法,可以直接引用已有Java类或对象(实例)的方法或构造器......
  • Java进阶篇-2
    不可变集合创建不可变集合的应用场景如果某个数据不能被修改,把它防御性地拷贝到不可变集合中是个很好的实践当集合对象被不可信的库调用时,不可变形式是安全的List<String>list=List.of("张三","李四","王五","赵六");Map<String,String>map=Map.of("张三","李四",&quo......
  • java.net.BindException: 地址已在使用
    java.net.BindException:地址已在使用,也可以说是端口被占用,通常出现在启动服务的时候。1、出错地方如图所示:2、执行netstat-alnp|grep81253、kill-9  1899   ......
  • vue前端几个常用的方法
    1,字符串数组去重的方法一、使用set结构去重set是ES6中的一种数据结构,可以去除重复元素,其特征为无序且不重复,经常用于数组去重的场景。letarr=[1,2,2,3,3,4,5];letset=newSet(arr);arr=Array.from(set);二、使用indexOf方法去重indexOf方法可以在数组中找......
  • 原来你是这样的JAVA--目录
    .NET程序员转Java过程中遇到的一些经验分享,陆续更新中。原来你是这样的Java[01]--基础一瞥原来你是这样的Java[02]-包、传参、构造器原来你是这样的Java[03]-继承、多态、抽象类更新中本人公众号[敬YES]同步更新,欢迎大家关注~觉得写的好的话,赞赏一下,是对博主......