Vue download file

简介: Vue download file

在 Vue 项目中使用 <a> 标签在 Chrome 浏览器中下载文件,目前测试网络路径图片,网络路径 mp4 文件,都会直接在浏览器当前 tab 页打开,代码示例如下

<a href="http://v1.keepcdn.com/video/2019/12/14/21/51/15763314900925df4e8e265dcbb4382acc709.mp4" download>mp4</a>

image.png

<a href="https://img.36krcdn.com/20200305/v2_dfec2fe8a18b49eeb5a7b9960c2ad500_img_png" download>png</a>

image.png

Version

Chrome: Version 80.0.3987.132 (Official Build) (64-bit)

Vue: v2.6.10

解决思路

使用 fetch 获取 url 得到 blob 对象,下载 window.URL.createObjectURL() 生成的 object url 就行了

<template>
  <div>
    <a
      href="http://v1.keepcdn.com/video/2019/12/14/21/51/15763314900925df4e8e265dcbb4382acc709.mp4"
      download
    >mp4</a>
    <a
      href="https://img.36krcdn.com/20200305/v2_dfec2fe8a18b49eeb5a7b9960c2ad500_img_png"
      download
    >png</a>
    <a ref="download" :href="downloadUrl" :download="downloadFileName">download</a>
    <input type="button" @click="downloadClick" value="download" />
  </div>
</template>
<script>
export default {
  data () {
    return {
      downloadFileName: '',
      downloadUrl: ''
    }
  },
  methods: {
    async downloadClick () {
      let url = 'http://v1.keepcdn.com/video/2019/12/14/21/51/15763314900925df4e8e265dcbb4382acc709.mp4' // 网络路径文件地址
      const res = await fetch(url)
      console.log(res)
      const blob = await res.blob()
      console.log(blob)
      const urlBlob = window.URL.createObjectURL(blob) // 创建 object url,没有这一步下载的 blob 文件会出现 Failed 情况
      console.log('urlBlob: ', urlBlob)
      this.downloadUrl = urlBlob
      console.log('downloadUrl: ', this.downloadUrl)
      this.downloadFileName = 'a.mp4' // 文件名需要动态赋值
      console.log('fileName: ', this.downloadFileName)
      setTimeout(() => {
        this.$refs.download.click()
      }, 200)
    }
  }
}
</script>

参考

developer.mozilla.org/zh-CN/docs/…

developer.mozilla.org/zh-CN/docs/…

developer.mozilla.org/zh-CN/docs/…

segmentfault.com/a/119000001…

Vue a download file

Vue download base64 file

目录
相关文章
|
2天前
|
JavaScript
|
3天前
|
JavaScript
【vue】el-dialog 内的tinymce弹窗被遮挡的解决办法 及 tinymce打开弹出菜单后直接关闭对话组件,导致该弹出菜单残留
【vue】el-dialog 内的tinymce弹窗被遮挡的解决办法 及 tinymce打开弹出菜单后直接关闭对话组件,导致该弹出菜单残留
14 6
|
1天前
|
存储 缓存 JavaScript
vue代码优化方案
【7月更文挑战第13天】 **Vue.js 优化要点:** 分解大组件以提高复用性和加载速度;利用计算属性与侦听器优化数据处理;使用Object.freeze()减少响应式数据;借助Vuex或Composition API管理状态;实现虚拟滚动和无限加载提升长列表性能;路由懒加载减少初始加载时间;用Vue DevTools检测性能瓶颈;定期代码审查与重构;应用缓存策略;遵循最佳实践与团队规范,提升应用整体质量。
10 2
|
3天前
|
JavaScript 前端开发
【vue】 el-table解决分页不能筛选全部数据的问题
【vue】 el-table解决分页不能筛选全部数据的问题
15 4
|
3天前
|
JavaScript
【vue】 vue2 监听滚动条滚动事件
【vue】 vue2 监听滚动条滚动事件
10 1
|
3天前
|
JavaScript 定位技术
【天地图】vue 天地图 T is not defined
【天地图】vue 天地图 T is not defined
14 1
|
3天前
|
JavaScript 前端开发
【vue】 Tinymce 数据 回显问题 | 第一次正常回显后面,显示空白bug不能编辑
【vue】 Tinymce 数据 回显问题 | 第一次正常回显后面,显示空白bug不能编辑
9 0
|
3天前
|
JavaScript 前端开发 数据安全/隐私保护
【vue】自定义指令实现 复制、长按、水印 功能
【vue】自定义指令实现 复制、长按、水印 功能
9 0
|
3天前
|
JavaScript
【vue】图片懒加载 vue-lazyload 使用
【vue】图片懒加载 vue-lazyload 使用
8 0
|
3天前
|
JavaScript
【vue】 vue如何根据不同路由地址更改页面的标题
【vue】 vue如何根据不同路由地址更改页面的标题
5 0