关于前端文件下载各类方式大汇总

目录
  • 总结:下载文件的方式
    • 1.a 标签配置 download 属性
    • 2.window.location.href/window.open()
    • 3.<a> 标签 + Blob方式
    • 4.使用 form 表单提交
    • 5.实现下载进度条
  • WEB前端是干什么的?
    • Web前端是什么?
    • 可以这么理解
    • Web前端技术可以做什么呢?

总结:下载文件的方式

  • a 标签配置 download 属性 (适用于下载一些静态资源)
  • window.location.href (适用于下载一些静态资源)
  • a 标签 + Blob 方式
  • 使用 form 表单提交

1.a 标签配置 download 属性

<a href="test.zip" rel="external nofollow"  download="test.zip">download</a>

download 用来命名下载文件,以及防止 txt , jpg , pdf 等浏览器支持直接打开的文件不能下载(需要注意的是,href地址不能写完整的域名,否则只能预览也不能下载。另外,下载的地址域名和访问网站的域名必须是同源,否则 download 设置无效)。

2.window.location.href/window.open()

window.location.href = '你的 url';
// 或
window.open('你的 url');

这种方式比较常见,比如我们在一些网站上下载电子书,安装包之类的,一般都是这种方式或 a 标签方式下载的。

3.<a> 标签 + Blob方式

1.下载 api

export function downloadApi() {
  return request({
    url: '/testApi',
    method: 'get',
    responseType: 'blob'
  })
}

注:这里的 request 是用 axios 封装的一个方法,详情可见:vue开发中 axios 的封装

2.项目下载操作代码

    // vue 代码
    downClick () {
      downloadApi().then(resBlob => {
        this._download(resBlob)
      })
    },
    _downloads (resBlob) {
      const projectName = '项目.zip'
      // IE|Edge
      if (window.navigator && window.navigator.msSaveOrOpenBlob) {
        window.navigator.msSaveBlob(resBlob, projectName)
      } else {
        // 其他浏览器
        const blobUrl = window.URL.createObjectURL(resBlob)
        const a = document.createElement('a')
        a.style.display = 'none'
        a.download = projectName
        a.href = blobUrl
        document.body.appendChild(a) // 兼容火狐
        a.click()
        document.body.removeChild(a)
        window.URL.revokeObjectURL(blobUrl)
      }
    },

这里我们使用了 a 标签加 blob 的方式,这种方式适用于下载响应比较耗时的情况。它会提前将文件下载完成后,再由前端进行下载。比如,后端在下载前需要进行一系列耗时操作来生成下载文件,这会让用户误以为没有正确点击下载而重复点击下载按钮。通过这种方式我们可以做一些loading 之类的处理。

当然,如果不需要 loading 之类的处理,可以直接通过 a 标签点击下载,而无需 blob 方式。

注意:

上面这个 blob 方式在我们下载失败时仍然会下载文件,当我们要处理后端抛出的错误信息时,就行不通了。解决方法两种:

3.1. 使用 Response(IE不支持)

    downClick () {
      downloadApi().then(async resBlob => {
        let resObj = {}
        if (resBlob.size == 0) {
          // 没有数据可导出
        } else if (resBlob.type == 'application/json') {
          // 返回(错误)信息
          resObj = await (new Response(resBlob)).text()
          // 得到错误信息
          resObj = JSON.parse(resObj)
        }
        // ... 相关判断处理
        this._download(resBlob)
      })
    },

3.2. 使用 FileReader

    downClick () {
      downloadApi().then(resBlob => {
        let resObj = {}
        if (resBlob.size == 0) {
          // 没有数据可导出
        } else if (resBlob.type == 'application/json') {
          // 返回(错误)信息
          const reader = new FileReader()
          reader.addEventListener('loadend', () => {
            // reader.result 包含被转化为一个字符串内容的 blob
            resObj = JSON.parse(reader.result)
            if (/* 是错误信息 */) {
              // 相关判断处理
            }
          })
          reader.readAsText(resBlob)
        } else {
          this._download(resBlob)
        }
      })
    },

4.使用 form 表单提交

  /**
   * 使用 form-data -post 方式导出文件
   * @param url 导出地址
   * @param params 参数
   */
  const postFormDataFile = (url, params) => {
    const form = document.createElement('form')
    form.style.display = 'none'
    form.action = BASE_URL + url
    form.method = 'post'
    document.body.appendChild(form)
    // 动态创建 input 并给 value 赋值
    for (const key in params) {
      const input = document.createElement('input')
      input.type = 'hidden'
      input.name = key
      input.value = params[key]
      form.appendChild(input)
    }
    form.submit()
    form.remove()
  }

注意:传给后端的参数不是 json 对象的形式,而是 currentPage=2&pageSize=20 形式。

5.实现下载进度条

原理:设置 onDownloadProgress 事件

export function downloadProject(projectId) {
  return request({
    url: downloadProjectUrl + projectId,
    method: 'get',
    responseType: 'blob',
    onDownloadProgress: function (event) {
      // 注意: 后端需要设置响应头 Content-Length, 否则 event.lengthComputable 就会为 false, event.total 为 0
      // event.loaded 得到当前已加载的数据大小, event.total 拿到总的数据大小, 通过两者的比值就知道其进度。
      console.log('event', event)
    }
  })
}

event 参数内容如下:

知识参考【MDN】

Blob

URL.createObjectURL()

FileReader

Response

WEB前端是干什么的?

在了解Web前端之前,我们要先了解一下什么是“WEB”。

WEB(World Wide Web)即全球广域网,也称为万维网,它是一种基于超文本和HTTP的、全球性的、动态交互的、跨平台的分布式图形信息系统。

其实,WEB就是全球互联网系统的统称,再简单点讲,WEB就是互联网。

Web前端是什么?

Web前端即给用户展示的网页页面,也就是网站的前台部分,这里面可能包含了设计、特效、用户交互等。

Web前端开发就是创建Web页面,或者APP等前端界面呈现给用户的过程,通过HTML、CSS及JavaScript等衍生出来的各种技术、框架、解决方案,来实现互联网产品的用户界面交互。

那么,什么是HTML、CSS、JavaScript?

可以这么理解

1、HTML

HTML称为超文本标记语言,是一种标识性的语言,制作网页永远离不开HTML。

HTML5是Web中核心语言HTML的规范。

因此,无论是PC端还是APP端的应用,前端样式都离不开HTML5。

2、CSS

CSS就是层叠样式表,它主要是对HTML标记的内容进行更加丰富的装饰,并将网页表现样式与网页结构分离的一种样式设计语言。

CSS可以控制HTML页面中的文本内容、图片外形以及版面布局等外观的显示样式。是一种用来表现HTML或XML等文件样式的计算机语言。

通俗点讲,CSS就是给网页“化妆”的一种技术。

3、JavaScript

是一种属于网络的脚本语言,已经被广泛用于Web应用开发,常用来为网页添加各式各样的动态功能,为用户提供更流畅美观的浏览效果。

它是一种具有函数优先的轻量级,解释型或即时编译型的高级编程语言。是一种基于原型、函数先行的语言,同时是一门多范式的语言,它支持面向对象编程,命令式编程,以及函数式编程。

JavaScript的作用主要用来向HTML页面添加交互行为,可以这么理解,如果没有JavaScript技术的支持,那么网页会变成一种“只能看不能用”的观赏性页面。

Web前端开发技术在各类编程语言中,属于相对入门简单、易上手的编程技术,深受转行人员、初学者的青睐。

Web前端技术可以做什么呢?

1、网站制作

这是掌握Web技术从业者最多的一个领域,网站制作就是网站通过页面结构定位、合理布局、图片文字处理、程序设计、数据库设计等一系列工作的总和,也是将网站设计师制定的总体规划用HTML的方式展示出来。

2、小程序开发

随着微信用户的不断增加,微信在近几年推出的小程序深受用户喜爱,应用数量超过了一百万,覆盖200多个细分的行业,日活用户达到两个亿,各大企业都纷纷参入其中,也是Web前端开发人员一个不错的选择。

3、APP开发

App开发,是指专注于手机应用软件开发与服务。通常专指手机上的应用软件,或称手机客户端。因此,专攻APP开发,同样是Web培训后的就业方向,并且发展态势不断上升,未来前景广阔。

随着互联网发展越来越多元,Web前端工程师的就业路径也更加宽广。现在越来越多的IT企业,对用户体验更加注重,Web前端开发人员的行业需求量也一直不少。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 前端axios下载excel文件(二进制)的处理方法

    需求:通过后端接口下载excel文件,后端没有文件地址,返回二进制流文件 实现:axios(ajax类似) 主要代码: axios:设置返回数据格式为blob或者arraybuffer 如: var instance = axios.creat({ ... //一些配置 responseType: 'blob', //返回数据的格式,可选值为arraybuffer,blob,document,json,text,stream,默认值为json }) 请求时的处理: getExcel().then

  • 前端 javascript 实现文件下载的示例

    在 html5 中,a 标签新增了 download 属性,包含该属性的链接被点击时,浏览器会以下载文件方式下载 href 属性上的链接.示例: <a href="https://www.baidu.com" rel="external nofollow" download="baidu.html">下载</a> 1. 前端 js 下载实现与示例 通过 javascript 动态创建一个包含 download 属性的 a

  • JavaScript实现多文件下载方法解析

    对于文件的下载,可以说是一个十分常见的话题,前端的很多项目中都会有这样的需求,比如 highChart 统计图的导出,在线图片编辑中的图片保存,在线代码编辑的代码导出等等.而很多时候,我们只给了一个链接,用户需要右键点击链接,然后选择"另存为",这个过程虽说不麻烦,但还是需要两步操作,倘若用户想保存页面中的多个链接文件,就得重复操作很多次,最常见的就是英语听力网站上的音频下载,手都要点麻! 本文的目的是介绍如何利用 javascript 进行多文件的下载,也就是当用户点击某个链接或者按

  • 关于前端文件下载各类方式大汇总

    目录 总结:下载文件的方式 1.a 标签配置 download 属性 2.window.location.href/window.open() 3.<a> 标签 + Blob方式 4.使用 form 表单提交 5.实现下载进度条 WEB前端是干什么的? Web前端是什么? 可以这么理解 Web前端技术可以做什么呢? 总结:下载文件的方式 a 标签配置 download 属性 (适用于下载一些静态资源) window.location.href (适用于下载一些静态资源) a 标签 + Blob

  • 浏览器兼容性问题大汇总

    JavaScript 1.HTML对象获取问题 FireFox:document.getElementById("idName"); ie:document.idname或者document.getElementById("idName"). 解决办法:统一使用document.getElementById("idName"); 2.const问题 说明:Firefox下,可以使用const关键字或var关键字来定义常量; IE下,只能使用var

  • 前端使用koa实现大文件分片上传

    目录 引言 前端 拆分上传的文件流 后端 接收文件片段 合并文件片段 总结 引言 一个文件资源服务器,很多时候需要保存的不只是图片,文本之类的体积相对较小的文件,有时候,也会需要保存音视频之类的大文件.在上传这些大文件的时候,我们不可能一次性将这些文件数据全部发送,网络带宽很多时候不允许我们这么做,而且这样也极度浪费网络资源. 因此,对于这些大文件的上传,往往会考虑用到分片传输. 分片传输,顾名思义,也就是将文件拆分成若干个文件片段,然后一个片段一个片段的上传,服务器也一个片段一个片段的接收,最

  • 软件测试方法大汇总

    软件测试方法大汇总 软件测试方法种类繁多,记忆起来混乱, 如果把软件测试方法进行分类, 就会清晰很多. 我参考一些书籍和网上的资料, 把常用的软件测试方法列出来, 让大家对软件测试行业有个总体的看法. 从测试设计方法分类 测试名称 测试内容 Black box黑盒测试 把软件系统当作一个"黑箱",无法了解或使用系统的内部结构及知识.从软件的行为,而不是内部结构出发来设计测试. White box白盒测试 设计者可以看到软件系统的内部结构,并且使用软件的内部知识来指导测试数据及方法的选择

  • Nginx多个前端服务配置方式详解

    目录 需求 Nginx多个前端服务配置方式 多个location配置 多个server配置 需求 有多个前端服务需要通过Nginx部署. Nginx多个前端服务配置方式 可以通过多个server配置或者多个location配置来配置多个前端服务. 多个location配置 location中root和alias的区别:location后面的路径是真实路径用root,虚拟路径用alias真实路径就是本地访问地址里面有的路径例如vue前端服务设置了publicPath='/allow-cost-ca

  • Vue路由跳转方式区别汇总(push,replace,go)

    目录 声明式导航router-link 1. 不带参数 2.带参数 编程式导航 1.this.$router.push 2.this.$router.replace 3.this.$router.go(n) 总结区别: 在浏览器中,点击链接实现导航的方式,叫做声明式导航.例如:普通网页中点击 a标签链接.vue项目中点击router-link标签链接都属于声明式导航.在浏览器中,调用API方法实现导航的方式,叫做编程式导航.例如:普通网页中调用location.href跳转到新页面的方式,属于编

  • PHP数学运算函数大汇总(经典值得收藏)

    本文汇总分析了PHP数学运算函数.分享给大家供大家参考,具体如下: 一.常用函数说明: Abs: 取得绝对值. Acos: 取得反余弦值. Asin: 取得反正弦值. Atan: 取得反正切值. Atan2: 计算二数的反正切值. base_convert: 转换数字的进位方式. BinDec: 二进位转成十进位. Ceil: 计算大于指定数的最小整数. Cos: 余弦计算. DecBin: 十进位转二进位. DecHex: 十进位转十六进位. DecOct: 十进位转八进位. Exp: 自然对

  • Yii使用技巧大汇总

    本文汇总了Yii使用技巧.分享给大家供大家参考,具体如下: 一.从yii权威指中学到的 db组件 'schemaCachingDuration'=>3600, 为什么不起做用? 需要开缓存 如何在页面下边显示sql的查询时间 在log组件的routes中加入 array( 'class'=>'CProfileLogRoute', 'levels'=>'error, warning', ) 同时在db组件中加入 复制代码 代码如下: 'enableProfiling'=>true,

  • Springboot导出文件,前端下载文件方式

    Springboot导出文件,前端下载文件 后端代码 可以把请求设置为post,我这里是Get @RequestMapping(value = "/download", method = RequestMethod.POST) public void download(HttpServletRequest request, HttpServletResponse res) throws Exception { File excelFile = new File("/Users

  • js千分位实现方法大汇总

    目录 千分位实现汇总 1.最最便捷的实现方式:toLocaleString() 2.正则匹配 3.for循环 4.slice+while循环 5.reduce 千分位分隔符 方法一 方法二 千分位实现汇总 1.最最便捷的实现方式:toLocaleString() 注:只针对数字格式有效! let num = 1234567890; num.toLocaleString(); //"1,234,567,890" 2.正则匹配 // 正则匹配方法一 let num = 1234567890

随机推荐