1. 将文件以流的形式一次性读取到内存,通过响应输出流输出到前端


  1. /**
  2. * @param path 想要下载的文件的路径
  3. * @param response
  4. * @功能描述 下载文件:
  5. */
  6. @RequestMapping("/download")
  7. public void download(String path, HttpServletResponse response) {
  8. try {
  9. // path是指想要下载的文件的路径
  10. File file = new File(path);
  11. log.info(file.getPath());
  12. // 获取文件名
  13. String filename = file.getName();
  14. // 获取文件后缀名
  15. String ext = filename.substring(filename.lastIndexOf(".") + 1).toLowerCase();
  16. log.info("文件后缀名:" + ext);
  17. // 将文件写入输入流
  18. FileInputStream fileInputStream = new FileInputStream(file);
  19. InputStream fis = new BufferedInputStream(fileInputStream);
  20. byte[] buffer = new byte[fis.available()];
  21. fis.read(buffer);
  22. fis.close();
  23. // 清空response
  24. response.reset();
  25. // 设置response的Header
  26. response.setCharacterEncoding("UTF-8");
  27. //Content-Disposition的作用:告知浏览器以何种方式显示响应返回的文件,用浏览器打开还是以附件的形式下载到本地保存
  28. //attachment表示以附件方式下载 inline表示在线打开 "Content-Disposition: inline; filename=文件名.mp3"
  29. // filename表示文件的默认名称,因为网络传输只支持URL编码的相关支付,因此需要将文件名URL编码后进行传输,前端收到后需要反编码才能获取到真正的名称
  30. response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, "UTF-8"));
  31. // 告知浏览器文件的大小
  32. response.addHeader("Content-Length", "" + file.length());
  33. OutputStream outputStream = new BufferedOutputStream(response.getOutputStream());
  34. response.setContentType("application/octet-stream");
  35. outputStream.write(buffer);
  36. outputStream.flush();
  37. } catch (IOException ex) {
  38. ex.printStackTrace();
  39. }
  40. } 

2. 将输入流中的数据循环写入到响应输出流中,而不是一次性读取到内存,通过响应输出流输出到前端


  1. /**
  2. * @param path 指想要下载的文件的路径
  3. * @param response
  4. * @功能描述 下载文件:将输入流中的数据循环写入到响应输出流中,而不是一次性读取到内存
  5. */
  6. @RequestMapping("/downloadLocal")
  7. public void downloadLocal(String path, HttpServletResponse response) throws IOException {
  8. // 读到流中
  9. InputStream inputStream = new FileInputStream(path);// 文件的存放路径
  10. response.reset();
  11. response.setContentType("application/octet-stream");
  12. String filename = new File(path).getName();
  13. response.addHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(filename, "UTF-8"));
  14. ServletOutputStream outputStream = response.getOutputStream();
  15. byte[] b = new byte[1024];
  16. int len;
  17. //从输入流中读取一定数量的字节,并将其存储在缓冲区字节数组中,读到末尾返回-1
  18. while ((len = inputStream.read(b)) > 0) {
  19. outputStream.write(b, 0, len);
  20. }
  21. inputStream.close();
  22. } 

3. 下载网络文件到本地


  1. /**
  2. * @param path 下载后的文件路径和名称
  3. * @param netAddress 文件所在网络地址
  4. * @功能描述 网络文件下载到服务器本地
  5. */
  6. @RequestMapping("/netDownloadLocal")
  7. public void downloadNet(String netAddress, String path) throws IOException {
  8. URL url = new URL(netAddress);
  9. URLConnection conn = url.openConnection();
  10. InputStream inputStream = conn.getInputStream();
  11. FileOutputStream fileOutputStream = new FileOutputStream(path);
  12. int bytesum = 0;
  13. int byteread;
  14. byte[] buffer = new byte[1024];
  15. while ((byteread = inputStream.read(buffer)) != -1) {
  16. bytesum += byteread;
  17. System.out.println(bytesum);
  18. fileOutputStream.write(buffer, 0, byteread);
  19. }
  20. fileOutputStream.close();
  21. } 

4. 网络文件获取到服务器后,经服务器处理后响应给前端


  1. /**
  2. * @param netAddress
  3. * @param filename
  4. * @param isOnLine
  5. * @param response
  6. * @功能描述 网络文件获取到服务器后,经服务器处理后响应给前端
  7. */
  8. @RequestMapping("/netDownLoadNet")
  9. public void netDownLoadNet(String netAddress, String filename, boolean isOnLine, HttpServletResponse response) throws Exception {
  10. URL url = new URL(netAddress);
  11. URLConnection conn = url.openConnection();
  12. InputStream inputStream = conn.getInputStream();
  13. response.reset();
  14. response.setContentType(conn.getContentType());
  15. if (isOnLine) {
  16. // 在线打开方式 文件名应该编码成UTF-8
  17. response.setHeader("Content-Disposition", "inline; filename=" + URLEncoder.encode(filename, "UTF-8"));
  18. } else {
  19. //纯下载方式 文件名应该编码成UTF-8
  20. response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(filename, "UTF-8"));
  21. }
  22. byte[] buffer = new byte[1024];
  23. int len;
  24. OutputStream outputStream = response.getOutputStream();
  25. while ((len = inputStream.read(buffer)) > 0) {
  26. outputStream.write(buffer, 0, len);
  27. }
  28. inputStream.close();
  29. } 

springboot文件流下载的更多相关文章

  1. js文件流下载通用方法

    通常我们会用到文件流下载文件,下面给大家一个通用的文件流下载的js /* *下载文件 * options:{ * url:'', //下载地址 * isNewWinOpen:false,是否新窗口打开 ...

  2. js实现使用文件流下载csv文件

    1. 理解Blob对象 在Blob对象出现之前,在javascript中一直没有比较好的方式处理二进制文件,自从有了Blob了,我们就可以使用它操作二进制数据了.现在我们开始来理解下Bolb对象及它的 ...

  3. 文件流下载时 axios blob文件大小不正确?

    文件流下载时 js blob文件大小不正确? res.data的字节长度 length blob.size匹配不上.. axio请求里必须修改 responseType: 'blob' 参数, 默认是 ...

  4. js 前端实现文件流下载的几种方式

    后端是用Java写的一个下载的接口,返回的是文件流,需求:点击,请求,下载 利用iframe实现文件流下载 //把上一次创建的iframe删掉,不然随着下载次数的增多页面上会一堆的iframe var ...

  5. 通过阿里OSS文件服务返回的URL获取文件流下载

    我们都知道将文件上传到阿里的OSS文件服务上后,可以通过generatePresignedUrl(bucketName, key, expiration)方法获取该文件的防问路径,但是当我们知道该文件 ...

  6. ASP.NET 实现Base64文件流下载PDF

    因为业务需要调用接口获取的是 Base64文件流 需要提供给客户下载PDF文档 源码部分借鉴网上,具体地址忘记了. //Base64文件流 byte[] buffer = Convert.FromBa ...

  7. byte转文件流 下载到本地

    此方法将byte类型文件转为文件流保存到本地 byte 经过BASE64Decoder 进行编码之后的类型 所以需要解码 防止出现乱码及文件损毁 /** * byte 转文件 下载到本地 * @par ...

  8. fetch的文件流下载及下载进度获取

    下载过程中,获取进度,fetch API并没有提供类似xhr和ajax的 progress所以用 getReader()来循环读取大小 let size = 0; fetch( URL() + `/s ...

  9. iText C# 合并PDF文件流,以及A5变A4时内容默认放在最底下的问题的解决方法;ASP.NET 实现Base64文件流下载PDF

    /// <summary> 合併PDF檔(集合) </summary> /// <param name="files">欲合併PDF檔之集合(一 ...

  10. Java文件流下载并提示文件不存在

    做文件下载功能的时候,一般使用流的形式下载文件, 如果源文件不存在,下载页面可能就会没有提示,或者一片空白 用户操作之后可能一头雾水,那如何友好提示呢? 想到的有两种 1.可以尝试下载一个名称为:文件 ...

随机推荐

  1. 重磅!瞄准 Web 3.0,谷歌云推出专为区块链服务的 Blockchain Node Engine!

    [本文由Cloud Ace整理发布,谷歌云服务请访问Cloud Ace 官网] 区块链技术正在为世界各地的消费者和企业带来巨大的创新和价值创造.随着技术变得越来越主流,公司需要可扩展.安全和可持续的基 ...

  2. 一文详解如何在基于webpack5的react项目中使用svg

    本文主要讨论基于webpack5+TypeScript的React项目(cra.craco底层本质都是使用webpack,所以同理)在2023年的今天是如何在项目中使用svg资源的. 首先,假定您已经 ...

  3. golang主协程等待子协程执行完毕

    无限等待 计时等待 channel通信 select 等待组

  4. Java 进阶P-8.15

    对象串行化 ObjectInputStream类 readObject() ObjectOutputStream类 writeObject() Serializable接口 对象的寿命通常随着生成该对 ...

  5. Django框架之drf:5、反序列化器校验部分源码分析、断言、drf之请求与响应、视图组件介绍及两个视图基类、代码部分实战

    Django框架之drf 目录 Django框架之drf 一.反序列化类校验部分源码解析 二.断言 三.drf之请求 1.Request能够解析的前端传入编码格式 2.Request类中的属性和方法 ...

  6. 【随笔记】全志平台 gpio-leds 驱动应用

    硬件信息 内核版本:Linux 4.9 硬件原理: GPIO 通过一颗 MOS 管(2N7002ET1G),接到 LED 负极,LED 正极接电源. GPIO 通过拉高导通 MOS ,将 LED 接地 ...

  7. openstacksdk快速上手

    hello,大家好,这里是费冰,今天是大年初六,唉,这么早就被迫营业了. 那么今天来解读一波openstacksdk. Openstacksdk是什么 其实我很难说明一个是什么的问题.如果你使用过py ...

  8. Linux三剑客日志处理系列

    三剑客日志处理系列 一.特殊符号 1.引号系列 必会 引号 含义 单引号 所见即所得,单引号里的内容会原封不动输出 双引号 和单引号类似,对双引号里面的特殊符号进行解析,对于{}花括号(通配符)没有解 ...

  9. 构建api gateway之 基于etcd实现动态配置同步

    配置中心 在之前 tcp的yaml配置 介绍了如何监听yaml文件变化然后更新配置. 当然假如我们有很多实例,那么yaml改动将是非常痛苦的事情,那么如何做到配置文件统一管理,实时更新呢? 我们可以引 ...

  10. Emacs单文件配置

    编辑 ~/.emacs 输入以下内容 ;; 编码 (set-language-info "UTF-8" 'coding-priority '(utf-8 gb18030 gbk g ...