iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >SpringBoot实现文件下载功能的方式分享
  • 499
分享到

SpringBoot实现文件下载功能的方式分享

SpringBoot实现文件下载SpringBoot文件下载SpringBoot下载 2023-03-23 14:03:02 499人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

1. 将文件以流的形式一次性读取到内存,通过响应输出流输出到前端 @RequestMapping("/download") public void download(String

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


@RequestMapping("/download")
public void download(String path, httpservletResponse response) {
    try {
        // path是指想要下载的文件的路径
        File file = new File(path);
        log.info(file.getPath());
        // 获取文件名
        String filename = file.getName();
        // 获取文件后缀名
        String ext = filename.substring(filename.lastIndexOf(".") + 1).toLowerCase();
        log.info("文件后缀名:" + ext);

        // 将文件写入输入流
        FileInputStream fileInputStream = new FileInputStream(file);
        InputStream fis = new BufferedInputStream(fileInputStream);
        byte[] buffer = new byte[fis.available()];
        fis.read(buffer);
        fis.close();

        // 清空response
        response.reset();
        // 设置response的Header
        response.setCharacterEncoding("UTF-8");
        //Content-Disposition的作用:告知浏览器以何种方式显示响应返回的文件,用浏览器打开还是以附件的形式下载到本地保存
        //attachment表示以附件方式下载   inline表示在线打开   "Content-Disposition: inline; filename=文件名.mp3"
        // filename表示文件的默认名称,因为网络传输只支持URL编码的相关支付,因此需要将文件名URL编码后进行传输,前端收到后需要反编码才能获取到真正的名称
        response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, "UTF-8"));
        // 告知浏览器文件的大小
        response.addHeader("Content-Length", "" + file.length());
        OutputStream outputStream = new BufferedOutputStream(response.getOutputStream());
        response.setContentType("application/octet-stream");
        outputStream.write(buffer);
        outputStream.flush();
    } catch (IOException ex) {
        ex.printStackTrace();
    }
}

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


@RequestMapping("/downloadLocal")
public void downloadLocal(String path, HttpServletResponse response) throws IOException {
   // 读到流中
   InputStream inputStream = new FileInputStream(path);// 文件的存放路径
   response.reset();
   response.setContentType("application/octet-stream");
   String filename = new File(path).getName();
   response.addHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(filename, "UTF-8"));
   ServletOutputStream outputStream = response.getOutputStream();
   byte[] b = new byte[1024];
   int len;
   //从输入流中读取一定数量的字节,并将其存储在缓冲区字节数组中,读到末尾返回-1
   while ((len = inputStream.read(b)) > 0) {
       outputStream.write(b, 0, len);
   }
   inputStream.close();
}

3. 下载网络文件到本地


@RequestMapping("/netDownloadLocal")
public void downloadNet(String netAddress, String path) throws IOException {
	  URL url = new URL(netAddress);
	  URLConnection conn = url.openConnection();
	  InputStream inputStream = conn.getInputStream();
	  FileOutputStream fileOutputStream = new FileOutputStream(path);
	
	  int bytesum = 0;
	  int byteread;
	  byte[] buffer = new byte[1024];
	  while ((byteread = inputStream.read(buffer)) != -1) {
	      bytesum += byteread;
	      System.out.println(bytesum);
	      fileOutputStream.write(buffer, 0, byteread);
	  }
	  fileOutputStream.close();
}

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


@RequestMapping("/netDownLoadNet")
public void netDownLoadNet(String netAddress, String filename, boolean isOnLine, HttpServletResponse response) throws Exception {

    URL url = new URL(netAddress);
    URLConnection conn = url.openConnection();
    InputStream inputStream = conn.getInputStream();

    response.reset();
    response.setContentType(conn.getContentType());
    if (isOnLine) {
        // 在线打开方式 文件名应该编码成UTF-8
        response.setHeader("Content-Disposition", "inline; filename=" + URLEncoder.encode(filename, "UTF-8"));
    } else {
        //纯下载方式 文件名应该编码成UTF-8
        response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(filename, "UTF-8"));
    }

    byte[] buffer = new byte[1024];
    int len;
    OutputStream outputStream = response.getOutputStream();
    while ((len = inputStream.read(buffer)) > 0) {
        outputStream.write(buffer, 0, len);
    }
    inputStream.close();
}

5. 常见异常和问题

(1)响应对象无需通过return返回

原因:  响应对象是可以不用作为方法返回值返回的,其在方法执行时已经开始输出,且其无法与@RestController配合,以JSON格式返回给前端

解决办法: 删除return语句

(2)返回前端的文件名必须进行URL编码

原因: 网络传输只能传输特定的几十个字符,需要将汉字、特殊字符等经过Base64等编码来转化为特定字符,从而进行传输,而不会乱码

URLEncoder.encode(fileName, "UTF-8")

(3)IO流有待学习

1:read() : 从输入流中读取数据的下一个字节,返回0到255范围内的int字节值。如果因为已经到达流末尾而没有可用的字节,则返回-1。在输入数据可用、检测到流末尾或者抛出异常前,此方法一直阻塞。

2:read(byte[] b) : 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。以整数形式返回实际读取的字节数。在输入数据可用、检测到文件末尾或者抛出异常前,此方法一直阻塞。如果 b 的长度为 0,则不读取任何字节并返回 0;否则,尝试读取至少一个字节。如果因为流位于文件末尾而没有可用的字节,则返回值 -1

以上就是SpringBoot实现文件下载功能的方式分享的详细内容,更多关于springBoot文件下载的资料请关注编程网其它相关文章!

--结束END--

本文标题: SpringBoot实现文件下载功能的方式分享

本文链接: https://www.lsjlt.com/news/201054.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • SpringBoot实现文件下载功能的方式分享
    1. 将文件以流的形式一次性读取到内存,通过响应输出流输出到前端 @RequestMapping("/download") public void download(String ...
    99+
    2023-03-23
    SpringBoot实现文件下载 SpringBoot文件下载 SpringBoot下载
  • SpringBoot如何实现文件下载功能
    这篇文章主要介绍“SpringBoot如何实现文件下载功能”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“SpringBoot如何实现文件下载功能”文章能帮助大家解决问题。1. 将文件以流的形式一次性...
    99+
    2023-07-05
  • python 下载文件的几种方式分享
    目录1 、一般同步下载2、 使用流式请求,requests.get方法的stream3 、异步下载文件4、 异步拆分下载文件5、注意1 、一般同步下载 示例代码: import...
    99+
    2022-11-12
  • SpringBoot实现文件上传下载功能小结
    最近做的一个项目涉及到文件上传与下载。前端上传采用百度webUploader插件。有关该插件的使用方法还在研究中,日后整理再记录。本文主要介绍SpringBoot后台对文件上传与下载的处理。单文件上传// 单文件上传@RequestMapp...
    99+
    2023-05-31
    spring boot 文件上传
  • Android实现下载文件功能的方法
    本文所述为Android实现下载文件功能的完整示例代码,对于学习和研究android编程相信会有一定的帮助,尤其是对Android初学者有一定的借鉴价值。 完整功能代码如下: ...
    99+
    2022-06-06
    方法 Android
  • SpringBoot文件上传与下载功能实现详解
    目录前言1、引入Apache Commons FileUpload组件依赖2、设置上传文件大小限制3、创建选择文件视图页面4、创建控制器5、创建文件下载视图页面前言 文件上传与下载是...
    99+
    2022-11-13
    SpringBoot文件上传 SpringBoot文件下载
  • SpringBoot怎么实现文件上传与下载功能
    这篇“SpringBoot怎么实现文件上传与下载功能”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“SpringBoot怎么实...
    99+
    2023-07-06
  • SpringBoot如何实现文件上传与下载功能
    今天小编给大家分享一下SpringBoot如何实现文件上传与下载功能的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。Sprin...
    99+
    2023-07-02
  • Android中实现下载和解压zip文件功能代码分享
    本文提供了2段Android代码,实现了从Android客户端下载ZIP文件并且实现ZIP文件的解压功能,非常实用,有需要的Android开发者可以尝试一下。 下载: Down...
    99+
    2022-06-06
    zip Android
  • SpringBoot下载文件的正确方式~
    Spring Boot 配合 axios 实现文件下载功能 前言比较一般的解法分析原因 正确解法 前言 最近遇到一个奇怪的需求,前端通过post请求下载压缩文件,同时会传给后端一些数据,用于生成压缩包。此时后端接口就不仅仅是...
    99+
    2023-08-23
    spring boot java spring
  • django 实现文件下载功能
    在实际的项目中很多时候需要用到下载功能,如导excel、pdf或者文件下载,当然你可以使用web服务自己搭建可以用于下载的资源服务器,如nginx,这里我们主要介绍django中的文件下载。前端实现方式a标签+响应头信息<a ...
    99+
    2023-01-31
    功能 文件 django
  • iOS实现文件下载功能
    本文实例为大家分享了iOS实现文件下载的具体代码,供大家参考,具体内容如下 说明: 1).获取网络文件大小; 2).开启循环,计算每段position开始与结束位置,通过Range头...
    99+
    2022-11-13
  • Servlet实现文件下载功能
    本文实例为大家分享了Servlet实现文件下载的具体代码,供大家参考,具体内容如下把文件目录直接暴露给用户是很不安全的。所以要用Servlet来做,而且这样做,文件的存储方式就更丰富了,可以是从文件系统上取来的,也可以是数据库中经过计算生成...
    99+
    2023-05-30
    servlet 文件下载 实现文件
  • SpringBoot实现文件上传与下载功能的示例代码
    目录Spring Boot文件上传与下载举例说明1.引入Apache Commons FileUpload组件依赖2.设置上传文件大小限制3.创建选择文件视图页面4.创建控制器5.创...
    99+
    2022-11-13
  • SpringBoot实现邮件发送功能的姿势分享
    目录前言I. 项目环境1. 项目依赖2. 配置II. 邮件发送1. 简单文本邮件发送2. html发送3. 添加附件4. Freemaker模板5. 测试与小结III. 不能错过的源...
    99+
    2022-11-12
  • vue+element+springboot实现文件下载进度条展现功能示例
    目录1. 需求背景2. 优化方案3. 具体实现3.1 前端代码3.2 后台代码4. 总结本文主要介绍了vue+element+springboot实现文件下载进度条展现功能示例,分享...
    99+
    2022-11-12
  • php实现文件下载功能的方法是什么
    本篇内容主要讲解“php实现文件下载功能的方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“php实现文件下载功能的方法是什么”吧!一、实现文件下载的基本原理在PHP中,实现文件下载的原理...
    99+
    2023-07-06
  • SpringBoot中下载文件的方式有哪些
    这篇文章将为大家详细讲解有关SpringBoot中下载文件的方式有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。文件来源这里还是以GridFS为例,主要演示的还是从mongo下载下来的文件,如果是本地...
    99+
    2023-06-21
  • springboot各种下载文件的方式汇总
    目录一、使用response输出流下载二、使用ResponseEntity三、注意总结一、使用response输出流下载 注意第一种方式返回值必须为void @GetMapping(...
    99+
    2022-11-13
    springboot下载文件 springboot下载文件到本地 Springboot下载文件
  • ztree+ajax实现文件树下载功能
    基于java实现文件树下载,供大家参考,具体内容如下 0.项目准备工作 1.前端用到的插件库: ztree官网 2.后端maven依赖: <dependencies>...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作