前端下载文件的几种方式

简介: 前端下载文件的几种方式

前言

实习一个人负责一个管理系统的前端部分。其中,就有前端下载文件的需要。最终采用的是使用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 Java
前端限制打包文件数量
前端限制打包文件数量
523 65
|
前端开发
前端引入字体文件
文章介绍了如何在前端项目中引入字体文件,并展示了具体的HTML和CSS代码示例,包括如何使用`@font-face`规则来定义字体和在页面中应用自定义字体。
799 1
前端引入字体文件
|
Dart 前端开发
【05】flutter完成注册页面完善样式bug-增加自定义可复用组件widgets-严格规划文件和目录结构-规范入口文件-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
【05】flutter完成注册页面完善样式bug-增加自定义可复用组件widgets-严格规划文件和目录结构-规范入口文件-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
631 75
【05】flutter完成注册页面完善样式bug-增加自定义可复用组件widgets-严格规划文件和目录结构-规范入口文件-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
|
前端开发 Cloud Native Java
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
|
前端开发
【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
1353 1
【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
|
前端开发 JavaScript API
前端JS读取文件内容并展示到页面上
前端JavaScript使用FileReader API读取文件内容,支持文本类型文件。在文件读取成功后,可以通过onload事件处理函数获取文件内容,然后展示到页面上。
771 2
前端JS读取文件内容并展示到页面上
|
前端开发 API
前端界面生成PDF并导出下载
【10月更文挑战第21天】利用合适的第三方库,你可以在前端轻松实现界面生成 PDF 并导出下载的功能,为用户提供更方便的文档分享和保存方式。你还可以根据具体的需求进一步优化和定制生成的 PDF 文件,以满足不同的业务场景要求。
|
JavaScript 前端开发 编译器
吐血整理:纯前端如何实现批量dom转图片,并下载成压缩包
【10月更文挑战第2天】吐血整理:纯前端如何实现批量dom转图片,并下载成压缩包
546 2
|
前端开发
前端diff文件对比使用worker进行优化
如何使用Web Worker在React项目中优化文件对比差异功能的实现。
413 5

热门文章

最新文章

  • 1
    前端如何存储数据:Cookie、LocalStorage 与 SessionStorage 全面解析
    1385
  • 2
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(九):强势分析Animation动画各类参数;从播放时间、播放方式、播放次数、播放方向、播放状态等多个方面,完全了解CSS3 Animation
    664
  • 3
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(八):学习transition过渡属性;本文学习property模拟、duration过渡时间指定、delay时间延迟 等多个参数
    516
  • 4
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(七):学习ransform属性;本文学习 rotate旋转、scale缩放、skew扭曲、tanslate移动、matrix矩阵 多个参数
    528
  • 5
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(六):全方面分析css的Flex布局,从纵、横两个坐标开始进行居中、两端等元素分布模式;刨析元素间隔、排序模式等
    618
  • 6
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(五):背景属性;float浮动和position定位;详细分析相对、绝对、固定三种定位方式;使用浮动并清除浮动副作用
    803
  • 7
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(四):元素盒子模型;详细分析边框属性、盒子外边距
    1596
  • 8
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(三):元素继承关系、层叠样式规则、字体属性、文本属性;针对字体和文本作样式修改
    373
  • 9
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(二):CSS伪类:UI伪类、结构化伪类;通过伪类获得子元素的第n个元素;创建一个伪元素展示在页面中;获得最后一个元素;处理聚焦元素的样式
    1309
  • 10
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(一):CSS发展史;CSS样式表的引入;CSS选择器使用,附带案例介绍
    638