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线程池ThreadPoolExecutor的八种拒绝策略示例详解
ThreadPoolExecutor是一个典型的缓存池化设计的产物,因为池子有大小,当池子体积不够承载时,就涉及到拒绝策略。JDK中已预设了 4 种线程池拒绝策略,下面结合场景详细聊聊这些策略的使用场景以及还能扩展哪些拒绝策略2021-11-11
SpringBoot整合ShardingSphere的示例代码
本文主要介绍了SpringBoot整合ShardingSphere的示例代码,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2021-09-09
SpringBoot基于拦截器与ThreadLocal实现用户登录校验
本文介绍了一种在SpringBoot中实现统一登录校验和上下文共享的解决方案,通过使用拦截器、ThreadLocal和自定义工具类,实现了在请求处理过程中优雅地获取当前登录用户信息,并且避免了在每个Controller方法中重复编写校验代码,需要的朋友可以参考下2025-12-12


最新评论