资讯专栏INFORMATION COLUMN

简谈文件下载的三种方式

lsxiao / 1018人阅读

摘要:一前言本文章将以报表下载为例,给大家介绍三种文件下载的方式。通过二进制数据流的方式下载这种方式是我目前采用的方式,用于处理报表下载。缺点对于数据量不大的文件,这种方式是可行的。

一、前言

本文章将以excel报表下载为例,给大家介绍三种文件下载的方式。

原文地址:简谈文件下载的三种方式 | Rychou

二、正文 1. 通过服务器文件地址下载

这是最常见的文件下载方式,大多数网站的音频、视频、种子文件等文件的下载方式都是通过这种方式实现的。

这种方式具体的实现方式是这样的:

前端请求获取excel报表的下载地址

后端根据前端的请求,查询数据库并把查询结果保存到服务器的一个excel文件中

后端把这个excel文件地址返回给前端

前端将此excel文件地址赋值给一个,并点击此标签,利用浏览器的默认行为下载此文件。

优点:实现方式简单,通用。
缺点:需要把文件保存到服务器,会占用服务器资源。这个缺点也有解决方式:给保存的文件设定一个时效性,过了这个时效,服务器就会删除这个文件。
2. 通过二进制数据流的方式下载

这种方式是我目前采用的方式,用于处理报表下载。

这种方法的具体实现流程如下:

前端请求获取excel报表的二进制数据流

后端根据前端请求,查询数据库并把查询结果转成二进制数据流。注意:这里并不生成一个文件保存在服务器

后端把二进制数据流返回给前端

前端把二进制数据流转成URL对象并赋值给标签

点击标签实现下载

我用的是axios网络请求库

代码示例:

axios({
  url: "/monitors/export",
  method: "GET",
  responseType: "blob",//指定返回数据格式
}).then(res => {
  // 将二进制数据流转成URL对象
  const url = window.URL.createObjectURL(
    new Blob([res.data], {
      type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8",
    }),
  );
  const link = document.createElement("a");
  link.href = url;
  link.setAttribute("download", "车辆监控列表.xls"); // 需要指定文件格式。
  document.body.appendChild(link);
  link.click(); //点击事件
});
优点:不需要服务器生成文件,并保存到服务器中,可以有效减少服务器资源占用。
缺点:这种方式可能并不那么通用,也可能有一定的兼容性问题。
3. 前端下载

这种方式是我测试过,确实可行的一种方法,它的具体实现原理是这样的,前端通过类似export-from-json的库,把JSON格式的报表数据,导出到excel文件中。

优点:不需要为下载多带带发起一次网络请求,直接把保存在前端的请求的报表数据,导出到excel文件即可。
缺点:对于数据量不大的文件,这种方式是可行的。但是对于数据量很大,像几千几万条数据的话,性能缓慢是它最大的弊端。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/72012.html

相关文章

  • 简谈文件下载三种方式

    摘要:一前言本文章将以报表下载为例,给大家介绍三种文件下载的方式。通过二进制数据流的方式下载这种方式是我目前采用的方式,用于处理报表下载。缺点对于数据量不大的文件,这种方式是可行的。 一、前言 本文章将以excel报表下载为例,给大家介绍三种文件下载的方式。 原文地址:简谈文件下载的三种方式 | Rychou 二、正文 1. 通过服务器文件地址下载 这是最常见的文件下载方式,大多数网站的音频...

    2i18ns 评论0 收藏0
  • 简谈Java Enum

    摘要:常量接口是对接口的一种不良使用。如果这些常量最好被看作是枚举类型成员,那就应该用枚举类型来导出。因为客户端既不能创建枚举类型的实例,也不能对它进行扩展,因此很可能没有实例,而只有声明过的枚举常量。换句话说,枚举类型是实例受控的。 问题 我们偶尔能在项目中看到如下风格的代码: public class ResponseCode { public static final int ...

    BicycleWarrior 评论0 收藏0
  • 简谈Java String

    摘要:而用关键字调用构造器,总是会创建一个新的对象,无论内容是否相同。中对象的哈希码被频繁地使用比如在等容器中。字符串不变性保证了码的唯一性因此可以放心地进行缓存。对于所有包含方式新建对象包括的连接表达式,它所产生的新对象都不会被加入字符串池中。 前言 前阵子和同事在吃饭时聊起Java的String,觉得自己之前的笔记写的略显零散。故此又重新整理了一下。 String在Java中算是一个有意...

    ssshooter 评论0 收藏0
  • 简谈JavaScript闭包

    摘要:所以经常看到的说闭包就是绑定了上下文环境的函数。我更偏向于闭包是一个函数和声明该函数的词法环境的组合。里面的闭包先上一个闭包该例子的解释上面的代码,在函数里面定义的函数和这个函数声明的词法环境就形成了一个闭包。 闭包是什么 第一种说法:闭包创建一个词法作用域,这个作用域里面的变量被引用之后可以在这个词法作用域外面被自由访问,是一个函数和声明该函数的词法环境的组合 第二种说法:闭包就是...

    Zachary 评论0 收藏0

发表评论

0条评论

lsxiao

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<