常用前端文件下载方法

简介: 经常在项目中会遇到需要下载文件的需求,根据不同的需求和项目实现情况,通常有以下几种做法。

常用前端文件下载方法

经常在项目中会遇到需要下载文件的需求,根据不同的需求和项目实现情况,通常有以下几种做法。

使用a标签下载

这种情况一般是,文件放置在后端服务器中,这种下载相当于一个 get 请求,a标签属性href访问下载文件的地址,浏览器帮助进行下载。但是对于浏览器支持直接浏览的txt、png、jpg、gif等文件,点击时浏览器会直接预览文件不会直接下载(或者使用右键另存为方式下载)。

可以使用 download 属性告诉浏览器这个 a 标签不是打开页面预览而是进行下载。

注意: download 属性 仅支持 IE13 以上的版本,并且只支持同源下载链接,如果下载的文件资源跨域,则 download 属性不起作用。

// href 表示对应的请求资源的路径,download表示下载后文件的文件名
<a href="http://localhost:3000/test.xlsx" download="test.xlsx">
  点击下载
</a>;

使用window.open()或者location.href

使用方法与 a标签类似,利用浏览器帮助下载文件,对于浏览器支持预览的文件类型无法下载。

window.open("http://localhost:3000/test.xlsx");

location.href = "http://localhost:3000/test.xlsx";

使用Blob对象下载

利用Blob对象可以将文件流转化成Blob二进制对象。

为了避免直接打开问题,在解决了跨域问题的前提下(如Nginx),可以直接通过请求的方式拿到文件流,将文件流转为Blob格式,再通过a标签的download属性下载。

Blob解决下载问题还有一个场景是,如果后端无法提供一个文件下载地址,而是从接口返回文件二进制流,也可以使用这个方法。

以下新建Node应用,模拟后端接口返回二进制流的情况

const http = require("http");
const fs = require("fs");

// 创建服务
const server = http.createServer((req, res) => {
  // 下载接口
  if (req.url === "/download") {
    res.writeHead(200, {
      "Content-type": "application/vnd.ms-excel", // 返回excel文件
      // 跨域设置
      "Access-Control-Allow-Origin": "*",
      "Access-Control-Allow-Headers": "content-type",
    });

    // 异步读取文件内容
    fs.readFile("test.xlsx", (err, data) => {
      // 返回二进制流文件
      res.end(data);
    });
  }
});

// 服务启动在3000端口
server.listen(3000);
console.log("server run at 3000");

前端调用接口拿到返回数据后,转化为Blob对象,利用URL.createObjectUrl生成url地址,赋值在a标签的href属性上,结合download进行下载。

.then(resp=>{
  resp.blob().then(
    blobRes=>{
      // 用返回二进制数据创建一个Blob实例
      const blob = new Blob([blobRes], {
        type: "type:  `application/octet-stream` ",
      })
      // 通过URL.createObjectURL生成文件路径
      const url = window.URL.createObjectURL(blob)
      // 创建a标签
      const a = document.createElement("a")
      document.body.appendChild(a);
      a.style = "display: none";
      // 设置href属性为文件路径,download属性可以设置文件名称
      a.href = url;
      a.download = "test.xlxs";
      a.click()
      document.body.removeChild(a);
    },
    ()=>{
      throw new Error("下载失败")
    }
  )
})

前端生成 excel 文件

有时项目中会出现大量 Table 表格展示数据的情况,需要导出当前 Table中的数据生成 Excel文件,也可以选择前端生成 excel 文件的方式。

注意:简单的列表数据导出Excel文件可以使用这个方法,但是使用这个方法导出的文件无法调整文件样式。

需要先引入 “js-export-excel”这个库

npm install js-export-excel

js-export-excel 基本使用:

// 直接引入文件
import ExportJsonExcel from "js-export-excel";


const download = () => {
  // 新建 Excel 文件实例
  var option = {};
  // 设置 Excel 文件名,默认自带xlsx后缀
  option.fileName = 'excel';
  /*多个sheet*/
  /*每个sheet为datas中的一个object */
  option.datas = [
    {
      // Table中的数据数组
      sheetData: [
        { one: '一行一列', two: '一行二列' },
        { one: '二行一列', two: '二行二列' },
      ],
      // sheet名字
      sheetName: 'sheet',
      // 列数据过滤,按顺序表格列显示对应属性名下的数据。
      // 只有在 data 为 Array<object> 下起作用,可不传
      sheetFilter: ['one', 'two'],
      // 第一行 表头数据
      sheetHeader: ['第一列', '第二列'],
      // number 列宽 需与列顺序对应,屏幕宽度为100 20即为 1/5屏幕大小
      columnWidths: [20, 20],
    },
    {
      sheetData: [
        { one: '一行一列', two: '一行二列', three: '一行三列' },
        { one: '二行一列', two: '二行二列', three: '二行三列' },
      ],
      sheetName: 'sheet1',
      sheetFilter: ['one', 'one','three'],
      sheetHeader: ['第一列', '第二列', '第三列'],
      columnWidths: [20, 20, 20],
    },
  ];

  var toExcel = new ExportJsonExcel(option); //new
  toExcel.saveExcel(); //下载保存文件
};

导出 excel 文件如图所示:

111111.png

2222222222222.png

相关文章
|
2月前
|
JavaScript 前端开发 程序员
前端原生Js批量修改页面元素属性的2个方法
原生 Js 的 getElementsByClassName 和 querySelectorAll 都能获取批量的页面元素,但是它们之间有些细微的差别,稍不注意,就很容易弄错!
|
4月前
|
前端开发
前端base64转Blob,Blob转文件下载
前端将base64字符串转换为Blob对象,再将Blob对象转换为文件并实现下载。包括处理数据URL和纯base64字符串的情况,并提供了一个辅助函数用于转换。
90 2
|
3月前
|
JSON 前端开发 Go
前端文件下载的方式
【10月更文挑战第5天】
139 58
|
2月前
|
缓存 JavaScript 前端开发
JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用
本文深入讲解了 JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用。
73 5
|
2月前
|
监控 前端开发 jenkins
Jenkins 在前端项目持续部署中的应用,包括其原理、流程以及具体的实现方法
本文深入探讨了Jenkins在前端项目持续部署中的应用,涵盖其基本原理、流程及具体实现方法。首先介绍了Jenkins的基本概念及其在自动化任务中的作用,随后详细解析了从前端代码提交到生产环境部署的全过程,包括构建、测试、部署等关键步骤。最后,强调了持续部署中的代码质量控制、环境一致性、监控预警及安全管理等注意事项,旨在帮助开发者高效、安全地实施持续部署。
80 5
|
3月前
|
存储 前端开发 JavaScript
前端的全栈之路Meteor篇(四):RPC方法注册及调用-更轻量的服务接口提供方式
RPC机制通过前后端的`callAsync`方法实现了高效的数据交互。后端通过`Meteor.methods()`注册方法,支持异步操作;前端使用`callAsync`调用后端方法,代码更简洁、易读。本文详细介绍了Methods注册机制、异步支持及最佳实践。
|
4月前
|
前端开发 JavaScript
前端基础(九)_this基本使用、this指向判断、改变this指向的方法
本文介绍了JavaScript中this的基本使用、this指向的判断以及改变this指向的方法。
72 1
前端基础(九)_this基本使用、this指向判断、改变this指向的方法
|
4月前
|
前端开发
前端基础(十四)_隐藏元素的方法
本文介绍了几种在前端开发中隐藏元素的方法,包括使用`display:none`、`visibility:hidden`、`opacity:0`等CSS属性,并提供了相应的示例代码。此外,还提到了其他隐藏元素的技巧,如通过设置元素位置、使用`overflow`属性和`filter`属性以及`rgba`颜色值来实现元素的隐藏。
76 1
前端基础(十四)_隐藏元素的方法
|
3月前
|
前端开发 JavaScript
掌握微前端架构:构建现代Web应用的新方法
本文介绍了微前端架构的概念及其在现代Web应用开发中的优势与实施方法。微前端架构通过将应用拆分成独立模块,提升了开发效率和灵活性。其核心优势包括技术栈灵活性、独立部署、团队协作及易于维护。文章详细阐述了定义边界、选择框架、管理状态和通信等关键步骤,并讨论了状态同步、样式隔离及安全性等挑战。微前端架构有望成为未来Web开发的重要趋势。
|
4月前
|
前端开发
前端基础(十一)_Float浮动、清除浮动的几种方法
本文介绍了浮动的概念、属性、特性以及清除浮动的几种方法,并通过实例演示了如何使用CSS实现元素的浮动和处理浮动带来的问题。
136 3

热门文章

最新文章