【vue】下载字符串拼接的文件链接并重命名文件

本文介绍如何使用Vue.js通过字符串拼接创建下载链接,并演示了如何在点击按钮时重命名文件。通过window.downloadFile函数,结合XMLHttpRequest获取远程文件并利用saveAs进行本地保存。

【vue】下载字符串拼接的文件链接并重命名文件


字符串拼接链接代码示例:

this.url = "http://127.0.0.1:8080/test/upload/20210128/2b35f9d7a64c3a6455a6e596c5c70fd7.xlsx";
this.filename = "导出文件";
this.html = '<button type="button" class="el-button el-button--primary el-button--small"><i class="el-icon-download"></i><a style="color:#fff;outline:none;" οnclick=download("'+this.url+'","'+this.filename+'.xlsx")  href="#">下载</a></button>';

定义window函数

<script>
window.downloadFile = function (url,filename) {
  getBlob(url, function(blob) {
      saveAs(blob, filename);
  })
};

function getBlob(url,cb) {
    var xhr = new XMLHttpRequest();
    xhr.open('GET', url, true);
    xhr.responseType = 'blob';
    xhr.onload = function() {
        if (xhr.status === 200) {
            cb(xhr.response);
        }
    };
    xhr.send();
}
/**
 * 保存
 * @param  {Blob} blob
 * @param  {String} filename 想要保存的文件名称
 */
function saveAs(blob, filename) {
  if (window.navigator.msSaveOrOpenBlob) {
      navigator.msSaveBlob(blob, filename);
  } else {
    var link = document.createElement('a');
    var body = document.querySelector('body');

    link.href = window.URL.createObjectURL(blob);
    link.download = filename;

    // fix Firefox
    link.style.display = 'none';
    body.appendChild(link);

    link.click();
    body.removeChild(link);
    window.URL.revokeObjectURL(link.href);
  }
}
</script>

图片示例:
在这里插入图片描述
在这里插入图片描述

说明:
1.downloadFile函数定义到window中生效。

必备知识 一、编程式导航 在Vue中,页面有两种导航方式,分别是声明式导航和编程式导航。其中,使用<router-link>标签定义导航链接的方式属于声明式导航,前面已经介绍过;而编程式导航是先通过useRouter()函数获取全局路由实例,然后通过调用全局路由实例实现导航。本节将详细讲解编程式导航的使用。 Vue Router提供了useRouter()函数,使用它可以获取全局路由实例,示例代码如下。 <script setup> import { useRouter } from 'vue-router' const router = useRouter() </script> 全局路由实例常用的方法有push()方法、replace()方法和go()方法。 (1)push()方法 push()方法会向历史记录中添加一个新的记录,以编程方式导航到一个新的URL。当用户单击浏览器中的后退按钮时,会回到之前的URL。 push()方法的参数可以是一个字符串路径,或者一个描述地址的对象,示例代码如下。 //字符串路径 router.push('/about/tab1') //带有路径的对象 router.push({ path: '/about/tabl' }) //命名路由 router.push({ name: 'user', params: { userId: '123') }) 带查询参数,如/user?id=1 router.push({ path: '/user', query: (id:'1'} )) 带有Hash值,如/user#admin router.push({ path: '/user', hash: '#admin' }) 上述规则也适用于<router-link>的to属性。 如果在参数的对象中提供了path,则params会被忽略。为了传递参数,需要提供路由的name或者手动拼接带有参数的path,示例代码如下。 const id=123 //跳转到/user/123 router.push({ name: '/user', params: (userId} }) router.push({ path: '/user/${userId}`}) //以下是params不生效的情况 router.push({ path: '/user', params: { userId}}) (2)replace()方法 replace()方法与push()方法类似,都是以编程方式导航到一个新的URL。两者的区别在于,replace()方法在导航后不会向历史记录中添加新的记录,而是会替换历史记录中的当前记录。另外,在声明式导航中,为<router-link>标签添加replace 属性也能实现与replace()方法类似的效果,示例代码如下。 //编程式导航 router.replace({ path: '/user' }) <!-- 声明式导航 --> <router-link:to="(path: '/user' }" replace></router-link> (3)go()方法 go()方法用于实现前进或后退的效果,其参数表示历史记录中前进或后退的步数,类似于window.history.go(),相应的地址栏也会发生改变。例如,go(1)表示前进一条记录;go(-1)表示后退一条记录。 二、导航守卫 在大多数后台应用中,通常需要用户登录后才可以使用核心功能。例如,访问后台主页时,需要用户处于已登录状态,如果没有登录,则跳转到登录页面。用户在登录页面进行登录操作,若登录成功,则跳转到后台主页;若登录失败,则返回登录页面。为了控制路由的访问权限,可以用导航守卫来实现。 导航守卫主要分为全局导航守卫、导航独享守卫和组件导航守卫,简要介绍如下。 全局导航守卫:包括全局前置守卫beforeEach()和全局后置守卫afterEach(),在路由即将改变前和改变后进行触发。 导航独享守卫:目前只有beforeEnter()守卫,只有在路由导航到一个不同的页面时才会被触发,beforeEnter()守卫只适用于单个路由。 组件导航守卫:包括beforeRouteEnter·组件导航守卫:包括beforeRouteEnter()、beforeRouteUpdate()()、beforeRouteLeave()3个守卫。其中,beforeRouteEnter()守卫在路由进入之前被触发;beforeRouteUpdate()守卫在路由更新之前被触发;beforeRouteLeave()守卫在路由离开之前被触发。 全局导航守卫会拦截每个路由规则,从而对每个路由进行访问权限的控制,定义全局导航守卫的示例代码如下。 const router = createRouter() router.beforeEach((to,from,next)⇒(1) router.afterEach((to, from,next)⇒(1) 在上述代码中,调用beforeEach()方法定义了全局前置守卫,调用afterEach()方法定义了全局后置守卫。每个全局导航守卫方法中接收3个形参:to、from和next。其中,to表示目标路由对象;from表示当前导航正要离开的路由对象;next为函数。如果不接收 next()函数,则默认允许用户访问每一个路由;如果接收了next()函数,则必须调用next()函数,则必须调用next()函数,()否则不允许用户访问任何一个路由。 除此之外,next()函数具有3种调用方式,分别为next()、next(false)和其中,next()表示执行下一个钩子函数;next(false)表示强制停留在当前页面;next(‘/’)表示跳转到其他地址。 任务案例 案例题目:使用 Vue Router 实现登录权限控制和页面跳转的后台管理系统。 功能要求: 用户访问首页(/)时自动重定向到登录页; 登录页用户输入账号密码,验证成功后跳转到首页; 首页可跳转到“用户管理”和“设置”页; 未登录用户无法访问受保护页面; 可点击退出,清除登录信息并跳回登录页; 使用编程式导航(router.push()、router.replace())完成页面跳转; 使用全局前置守卫控制路由权限。给出完整代码
05-31
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王佑辉

老板,赏点吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值