IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> 前端下载文件的几种方式 -> 正文阅读

[JavaScript知识库]前端下载文件的几种方式

前端下载文件的几种方式

前言

实习一个人负责一个管理系统的前端部分。其中,就有前端下载文件的需要。最终采用的是使用axios发送get请求的方式,因为需要携带token。但是,不应该只注重结果,也应该注重过程,不然可能一直都是拧螺丝。另外提一嘴,找工作最好还是找能去的最大的公司,虽然小公司也能学到东西,但是因为制度不完善的缘故,可能会被不好的小公司坑,问就是一行泪。(去的小公司开始对实习生下手了,甚至有请假回去答辩时被背刺的)

a链接

极简版本

实际上,如果a链接的href就是指向文件的地址的话,是可以直接下载的。这种方式下载的文件名就是原本的文件名。

<a href="https://www.clzczh.top/medias/test.xlsx">下载文件</a>

image-20220430181604786

自定义文件名

通过download属性,可以实现对下载的文件进行重命名。

<a href="https://www.clzczh.top/medias/test.xlsx" download="clz.xlsx">下载文件</a>

上面不能实现重命名?

这是因为通过download属性来实现对下载的文件进行重命名需要是同源路径下。

换成同源路径后,就能实现自定义文件名了

<a href="/test.xlsx" download="clz.xlsx">下载文件</a>

image-20220430183758385

动态添加a标签

在上面的例子中,我们是通过点击a标签来实现下载文件的。但是,实际上,我们也可以通过动态添加a标签的形式来实现。

<button onclick="download()">下载文件</button>
?
<script>
  function download() {
    const a = document.createElement('a')
    a.href = '/test.xlsx'
    a.download = 'clz.xlsx'
    a.click()
  }
</script>

结果和上面一样

指定location的href

通过指定location对象的href属性,就可以在当前页面打开URL页面,其实就和上面a链接的极简版本一样效果。

<button onclick="download()">下载文件</button>
?
<script>
  function download() {
    window.location.href = '/test.xlsx'
  }
</script>

无法重命名

window.open

打开指定的页面的URL

<button onclick="download()">下载文件</button>
?
<script>
  function download() {
    window.open('/test.xlsx')
  }
</script>

无法重命名

axios

因为下载文件其实就相当于发起get请求,所以可以使用axios来发起请求,这样子就能够很方便地携带token等信息。

因为是下载文件,所以响应类型应该是blob,用来存取二进制数据

<button onclick="download()">下载文件</button>
?
<script>
  function download() {
    axios({
      url: "/test.xlsx",
      method: 'GET',
      responseType: 'blob',     // 用来存取二进制数据
      headers: {
        token: 'testtest'     // 可以携带token
      }
    }).then(res => {
      console.log(res)
    })
  }
</script>

image-20220430212722930

不过,此时并没有下载文件,因为此时是二进制数据。

image-20220430212915220

所以,我们还需要将二进制数据变成文件下载。

那么,怎么将二进制数据变成文件呢?

这里在网上找到一个方法,就是通过URL.createObjectURL方法,生成对应二进制数据blob对象的URL,然后通过动态添加a标签的方法,来实现生成文件。

  <button onclick="download()">下载文件</button>
?
  <script>
    function download() {
      axios({
        url: "/test.xlsx",
        method: 'GET',
        responseType: 'blob',
        headers: {
          token: 'testtest'     // 可以携带token
        }
      }).then(res => {
?
?
        const href = URL.createObjectURL(res.data)
        // console.log(href)
?
        const a = document.createElement('a')
        a.download = 'clz.xlsx'
        a.href = href
?
        a.click()
      })
    }
  </script>

将二进制数据变成文件也可以通过FileReaderreadAsDataURL来实现,该方法读取blob对象或file对象。读取成功后,能够通过onload回调函数中通过实例对象的target属性下的result属性中获取base64编码的URL。

const reader = new FileReader()
?
reader.readAsDataURL(res.data)
?
reader.onload = (e) => {
  console.log(e)
?
  const a = document.createElement('a')
  a.download = 'clz.xlsx'
  a.href = e.target.result
?
  a.click()
}

image-20220430215628865

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-06-08 18:57:17  更:2022-06-08 18:58:03 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 16:59:14-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码