vue从后端获取到文件的 url 地址及前端根据 url 地址下载文件的实现思路

 更新时间:2024年02月03日 10:27:42   作者:YZRHANYU  
这篇文章主要介绍了vue 中从后端获取到文件的 url 地址及前端根据 url 地址下载文件,项目用的是 vben admin 框架,用的是 vue3 + TS,后端返回的是文件的 url 地址,对vue后端获取 url 地址的相关知识感兴趣的朋友一起看看吧

前言

项目用的是 vben admin 框架,用的是 vue3 + TS
项目需求数据导出功能,前端需要实现文件下载功能
后端返回的是文件的 url 地址 (本项目中返回的是阿里云 oss 的文件地址)

一、实现思路

从后端得到的是一个 url 地址,先通过 fetch api 请求这个 url 地址并转换成 blob 对象,通过 URL.createObjectUrl() 将 blob 对象生成 url 地址,绑定到 <a > 标签 的 href 属性上面,结合 download 来实现点击 <a > 标签下载文件

二、具体实现

1.完整代码

代码如下:

  function exportData() {
    let data = getForm().getFieldsValue();
    exportTowerHistoryToExcel({ deviceId, createTime: data.startTime }).then((url) => {
	    downLoadFile(url);
    });
  }
	function downLoadFile (url){
      let fileName = url.slice(url.lastIndexOf('/') + 1); // 这里是通过从后端获取到的 url  地址中截出来原本的文件名
      fetch(url)
        .then((res) => res.blob())
        .then((blob) => {
          const link = document.createElement('a');
          link.href = URL.createObjectURL(blob);
          // 下载文件的名称及文件类型后缀
          link.download = fileName;
          document.body.appendChild(link);
          link.click();
          //在资源下载完成后 清除 占用的缓存资源
          window.URL.revokeObjectURL(link.href);
          document.body.removeChild(link);
        });
	}

2.代码分析

2.1 通过 fetch 将 url 地址转换为 blob 对象

以下图片来自w3cschool文档 fetch_api

分析

res.blob() 的返回值是什么
从文档中我们知道res.blob() 返回的并不是一个 blob 对象,而是一个 Promise,继续 .then 获取到的才是 blob 对象

res.blob() 到底做了什么
每调用一次 res.blob() 都会执行 consume budy 的动作
执行流程大概是这个样子 : 获取字节流的读取器 --> 通过读取器来读取到所有的数据 --> 将数据包装成 blob 对象并返回

2.2 通过 URL.createObjectUrl() 将 blob 对象生成 url 地址

以下图片来自MDN文档 URL.createObjectURL()

分析

URL.createObjURL() 做了什么
我们在调用 URL.createObjURL() 的时候传递的参数是一个 blob 对象,每次调用 URL.createObjURL() 的时候,都会创建一个新的 URL 对象
注意 : 即使是用同一个 blob 对象 , 每次调用 URL.createObjURL() 都会生成不同的 URL 对象

生成的的 URL 对象什么时候会被释放
浏览器在 docoment 卸载的时候,会自动释放
为了获得最佳性能和内存使用状况,应当在不需要使用这些 URL 对象的安全的实际,主动释放掉他们

怎么释放生成的的 URL 对象
通过调用 URL.removeObjectURL(需要释放的URL ) 可以来释放生成的 URL 对象

2.3 创建 <a> 标签元素,将该元素放到页面当中,并通过点击事件来实现下载功能

<a href="xxxxx" rel="external nofollow"  rel="external nofollow" >
<a href="xxxxx" rel="external nofollow"  rel="external nofollow"  download="xxxx">

href:文件的绝对/相对地址
download: 文件名(可省略,省略后浏览器自动识别源文件名 , 但是有可能导致自动识别源文件名的时候没有文件后缀,导致文件没有格式)

          const link = document.createElement('a');
          link.href = URL.createObjectURL(blob);
          // 下载文件的名称及文件类型后缀
          link.download = fileName; // 这里 download 可以不写
          document.body.appendChild(link);
          link.click();

总结

其实找到这个解决方案的时候直接拿来用挺顺利的,但是一开始并不明白它是怎么工作的,甚至每行都没太明白它为什么这么做,在整理下来的过程中,反而理解了一些东西,与君共勉~

到此这篇关于vue 中从后端获取到文件的 url 地址前端根据 url 地址下载文件的文章就介绍到这了,更多相关vue后端获取 url 地址内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vuex中的四个map方法的使用小结

    vuex中的四个map方法的使用小结

    vuex里面有四个map方法,他们分别可以针对不同的元素进行不同的代码生成,本文就来详细的介绍一下vuex中的四个map方法,具有一定的参考价值,感兴趣的可以了解一下
    2023-05-05
  • Vue中使用flv.js播放视频的示例详解

    Vue中使用flv.js播放视频的示例详解

    这篇文章主要为大家详细介绍了如何在Vue项目中使用flv.js播放视频,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-04-04
  • 详解vue与后端数据交互(ajax):vue-resource

    详解vue与后端数据交互(ajax):vue-resource

    本篇文章主要介绍了详解vue与后端数据交互(ajax):vue-resource,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-03-03
  • 一文详解Vue选项式 API 的生命周期选项和组合式API

    一文详解Vue选项式 API 的生命周期选项和组合式API

    这篇文章主要为大家介绍了Vue选项式 API 的生命周期选项和组合式API变化详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • Vue组件间通信方式全面汇总介绍

    Vue组件间通信方式全面汇总介绍

    这篇文章主要介绍了Vue组件间通信方式全面汇总,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-04-04
  • vue3路由配置以及路由跳转传参详解

    vue3路由配置以及路由跳转传参详解

    路由跳转的同时传递参数是比较常见的,下面这篇文章主要给大家介绍了关于vue3路由配置以及路由跳转传参的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-04-04
  • 对vue下点击事件传参和不传参的区别详解

    对vue下点击事件传参和不传参的区别详解

    今天小编就为大家分享一篇对vue下点击事件传参和不传参的区别详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-09-09
  • Vue如何将时间戳转换日期格式

    Vue如何将时间戳转换日期格式

    这篇文章主要介绍了Vue如何将时间戳转换日期格式,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-09-09
  • vue  自定义组件实现通讯录功能

    vue 自定义组件实现通讯录功能

    本文通过实例代码给介绍了vue使用自定义组件实现通讯录功能,需要的朋友可以参考下
    2018-09-09
  • vue项目中使用rem,在入口文件添加内容操作

    vue项目中使用rem,在入口文件添加内容操作

    这篇文章主要介绍了vue项目中使用rem,在入口文件添加内容操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11

最新评论