您现在的位置是:首页 > 技术教程 正文

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

admin 阅读: 2024-03-28
后台-插件-广告管理-内容页头部广告(手机)

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

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

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

直接上代码

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

解释一下

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

  2. 其次是设置响应头:

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

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

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

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

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

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

下面是完整代码

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

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

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

标签:
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

在线投稿:投稿 站长QQ:1888636

后台-插件-广告管理-内容页尾部广告(手机)
关注我们

扫一扫关注我们,了解最新精彩内容

搜索