当前位置:首页 > 技术分析 > 正文内容

前端文件下载的几种方式(前端文件下载的几种方式有哪些)

ruisui883个月前 (01-24)技术分析19

前端开发中,经常遇到文件下载的功能。这里对常见的文件下载方式做一些总结。


一、直接下载

针对一些浏览器无法识别的文件格式。可以直接在地址栏上输入URL即可触发浏览器的下载功能。

同类的还有window.location.href、window.open

  • 地址栏输入文件URL
  • window.location.href = URL
  • window.open(URL)

二、直接下载(使用a标签download属性)

直接下载仅使用的浏览器无法识别的文件。如果是浏览器支持的文件格式(如:html、jpg、png)等。则不会触发文件下载,而是被浏览器直接触发解析展示。

针对这种情况,我们可以使用a标签的download属性,可以设置文件名。

写法如下:

<a href="/images/download.jpg" download="myFileName">

开发中,我们遇到的还有一部分场景是js直接触发下载,也是相同的做法,我们可以手动写一个a标签。appen到body里边,触发下载之后,将其remove

示例如下(生产环境注意各浏览器事件的兼容性写法):

const download = (filename, link) => {
	let DownloadLink = document.createElement('a'); 
    DownloadLink.style = 'display: none'; // 创建一个隐藏的a标签
    DownloadLink.download = filename;
    DownloadLink.href = link;
    document.body.appendChild(DownloadLink);
    DownloadLink.click(); // 触发a标签的click事件
    document.body.removeChild(DownloadLink);
}

生产环境可以使用我封装的itools.js中的download方法。

三、直接下载(后端兼容处理attachment)

有很多场景。有些浏览器可识别的文件格式,我们还是需要直接下载的情况(如:用户直接分享的下载pdf、txt;很多浏览器也是支持展示的)。

这种情况下,我们需要声明一下文件的header的 Content-Disposition信息。告诉浏览器,该链接为下载附件链接,并且可以声明文件名(方式二也可以下载该类型文件,不过文件名会以header设置的文件名优先)。

写法如下:

Content-Disposition: attachment; filename="filename.xls" 

同类的方法还有将文件作为outstream返回

四、鉴权下载

在部分场景中,有一些文件,需要用户登录之后根据权限来开放下载(报表等)。

此时,我们需要将本地的用户信息传给服务端。常用的方式如:在header增加token。

这里我们需要使用XmlHttpRequest来向后台发起请求。并带上header信息,获取到文件数据之后,再使用下载方法。

axios示例如下:

axios({
    method:'get',
    url: '/download/file.doc'
    responseType: 'blob',
    headers: {
    	Authorization: '123456'
	}
}).then(res => {
    let fileUrl = window.URL.createObjectURL(res.data)
    iTools.download('filename',fileUrl) // 方法二使用到的a标签download方式。
    window.URL.revokeObjectURL(fileUrl)
})

原生写法自己可以百度一下

其他

以上就是常用的文件形式,不过在使用上这些形式还能有其他的使用形式。

  • 使用iframe来下载一类型
  • 使用post提交表单来做鉴权

测试代码

测试代码仓库地址:

git clone https://github.com/shb190802/front-end-file-download.git
cd front-end-file-download
npm install
node app.js
// 浏览器打开 http://localhost:3000

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/508.html

分享给朋友:

“前端文件下载的几种方式(前端文件下载的几种方式有哪些)” 的相关文章

vue组件间的九种通信方式

前言Vue组件实例间的作用域是相互独立的,而通常一个页面是由很多个组件构成,这些组件可能又嵌套了组件,形成了一个关系网图,它们的关系可能是像下图中一样,大致分为两种使用场景,父子组件间通信和非父子组件间通信,父子组件间通信又分为直接父子关系和间接父子关系。vue提供了多种通信方法,针对不同的通信需求...

30 个纯 HTML5 实现的游戏

浏览器和 JavaScript 的功能逐年不断的变强变大。曾几何时,任何类型的游戏都需要Flash。但随着 HTML5 发展,HTML5 + WebGL 游戏式就慢慢占领着这个舞台。以下是30款流行的游戏,它们可以在所有现代浏览器中运行,并且只使用web技术构建。1. HexGL地址:http://...

双子座应用程序推出模型切换器以在Android上访问2.0

#头条精品计划# 快速导读谷歌推出了Gemini 2.0 Flash实验版,现已在其安卓应用中可用,之前仅在gemini.google.com网站上提供。新版本的15.50包含模型切换器,用户可以在设置中选择不同模型,包括1.5 Pro、1.5 Flash和2.0 Flash实验版。谷歌提醒,2.0...

2024最新版:前端性能优化方案汇总

前端训练营:1v1私教,终身辅导计划,帮你拿到满意的 offer。 已帮助数百位同学拿到了中大厂 offer。欢迎来撩~~~~~~~~Hello,大家好,我是 Sunday。前端性能优化一直是很多同学非常关注的问题,在日常的面试中也是经常会被问到的点。所以今天咱们就花一点时间来了解一下2024最新的...

Vue进阶(幺叁捌):vue路由传参的几种基本方式

1、动态路由(页面刷新数据不丢失)methods:{ insurance(id) { //直接调用$router.push 实现携带参数的跳转 this.$router.push({ path: `/particulars/${id}`,...

Vue从入门到实践 丨Vue-router基本使用

1. 什么是 vue-routervue-router 是 vue.js 官方给出的路由解决方案。它只能结合 vue 项目进行使用,能够轻松的管理 SPA 项目中组件的切换。vue-router 的官方文档地址:https://router.vuejs.org/zh/2. vue-router 安装...