解决因跨域导致使用a标签下载文件download属性失效无法自定义命名的问题

问题背景:

在使用a标签下载文件时,download属性可以更改下载的文件名。

// 下载a.exe,并采用默认命名
<a href="/images/a.exe" download>点击下载</a>


// 将a.exe改名为b.exe下载
<a href="/images/a.exe" download="b">点击下载</a>

但是当a标签的下载链接跨域时,download属性将不会生效,原因是浏览器无法获取到文件,不能对他进行更改。

在这种情况下如果你是下载浏览器无法解析的文件,例如.exe,.xlsx..那么浏览器也会自动下载,但是如果你使用浏览器可以解析的文件,比如.txt,.png....浏览器就会采取预览模式,无法直接下载。

// 无法正常下载a.jpg,会直接预览
<a href="https://www.baidu.com/a.jpg" download>点击下载</a>

// 正常下载a.exe文件
<a href="https://www.baidu.com/a.exe" download>点击下载</a>

注意:

html5 新特性a标签download属性只支持谷歌和火狐
在谷歌和火狐浏览器a标签download属性修改文件名失效的原因:不同源,访问的域名和href的域名要一致。

a标签属性文档:<a>:锚元素 - HTML(超文本标记语言) | MDN

什么是同源url:

 解决方法:

使用Blob实现文件下载,先把文件以bobl的形式下载到当前页面,再创建a标签。

// 下载url(解决跨域a.download不生效问题)
      downloadFile(url, fileName) {
        const x = new XMLHttpRequest()
        x.open("GET", url, true)
        x.responseType = 'blob'
        x.onload = function(e) {
          const url = window.URL.createObjectURL(x.response)
          const a = document.createElement('a')
          a.href = url
          a.target = '_blank'
          a.download = fileName
          a.click()
          a.remove()
        }
        x.send()
      },

 使用方法:

      <el-link
        :disabled="validateNull(fileUrl)"
        :type="validateNull(fileUrl) ? 'info' : 'primary'"
        :underline="true"
        style="font-size:14px;"
        @click="downloadFile(fileUrl, fileName)"
      >
        {{ fileName|| '-' }}
      </el-link>

这里的validateNull是校验url是否为空:

/**
 * 判断是否为空
 */
export function validatenull(val) {
  if (typeof val === 'boolean') {
    return false;
  }
  if (typeof val === 'number') {
    return false;
  }
  if (val instanceof Array) {
    if (val.length===0) return true;
  } else if (val instanceof Object) {
    if (JSON.stringify(val) === '{}') return true;
  } else {
    if (val==='null' || val===null || val==='undefined' || val===undefined || val==='') return true;
    return false;
  }
  return false;
}

这个下载方法有个需要注意的问题就是,当自定义的fileName内存在小数点时(如 fileName = '附件v1.2.zip'),如果没有在fileName后面加上后缀名(fileName = '附件v1.2'),会导致下载时自动以第一个小数点后面的为文件后缀名(.2),所以这时还要加一个方法判断文件的后缀名,将后缀名加到自定义的文件名后面:

function getFileTypeByPath(pathUrl) {
  let index = pathUrl.lastIndexOf(".") // lastIndexOf(".")  找到最后一个  .  的位置
  let fileType = pathUrl.substr(index + 1) // substr() 截取剩余的字符,即文件后缀名 doc 、jpg 、 xlsx 等
  return fileType
}

此时我们传入的fileName为:

const suffix = this.getFileTypeByPath(fileUrl)
this.suffix = `.${suffix}`
const fileName = '附件v1.2'
this.fileName = `${fileName}${this.suffix}`

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/157361.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PT Plugin Plus(PT助手、种子下载)扩展程序安装教程

PT助手 PT 助手 Plus&#xff0c;是一款浏览器插件&#xff08;Web Extensions&#xff09;&#xff0c;主要用于辅助下载 PT 站的种子。 适用于各 PT 站&#xff0c;可使下载种子等各项操作变化更简单、快捷。配合下载服务器&#xff08;如 Transmission、Torrent 等&#x…

现货黄金休市时间长不长?科普一下交易时间

先告诉你答案&#xff0c;现货黄金市场每天的交易时间很长&#xff0c;因为它全天的盘面是由亚洲、欧洲和北美时间无缝地连接而成&#xff0c;无论投资者身处何方&#xff0c;通过哪里的平台入市&#xff0c;每天基本上都可以享受到连续20多个小时的行情。 只要投资者有足够的精…

C生万物 | 从浅入深理解指针【最后部分】

C生万物 | 从浅入深理解指针【最后部分】 文章目录 C生万物 | 从浅入深理解指针【最后部分】前言sizeof和strlen的对比sizeofstrlen 数组和指针笔试题解析一维数组字符数组二维数组 前言 我们前面学了四个部分了&#xff0c;如果没有看前面的建议可以看一下前面的~~ C生万物 |…

关于FreeRTOS函数xSemaphoreGiveFromISR卡死的问题

0. 概述 关于FreeRTOS函数xSemaphoreGiveFromISR卡死的问题 1. 遇到的问题 在使用FreeRTOS调试激光雷达检测面积的项目的时候&#xff0c;遇到一个现象&#xff1a;在新加了一个线程之后&#xff0c;把程序下载到板子之后程序不会运行&#xff08;实际上已经运行了&#xff…

Spring 6 提前编译:AOT

1、AOT概述 1.1、JIT与AOT的区别 JIT和AOT 这个名词是指两种不同的编译方式&#xff0c;这两种编译方式的主要区别在于是否在“运行时”进行编译 &#xff08;1&#xff09;JIT&#xff0c; Just-in-time,动态(即时)编译&#xff0c;边运行边编译&#xff1b; 在程序运行时…

解决Error:java: System Java Compiler was not found in classpath

解决Error:java: System Java Compiler was not found in classpath 一、配置maven 注意:我的C盘比较大直接配置在了C盘&#xff0c;建议配置到其他盘&#xff0c;记得做maven环境变量配置 二、卸载本地JDK&#xff0c;换个版本安装配置环境变量 重启电脑或idea&#xff0c;…

开发人员面临的10个最常见的JavaScript问题

今天&#xff0c;JavaScript 是几乎所有现代 Web 应用的核心。这就是为什么JavaScript问题&#xff0c;以及找到导致这些问题的错误&#xff0c;是 Web 发者的首要任务。 用于单页应用程序&#xff08;SPA&#xff09;开发、图形和动画以及服务器端JavaScript平台的强大的基于…

C语言调用【Python3】

一、搭建编译环境 终端查询系统及软件版本dpkg -l 列出所有已安装的软件包 二、C语言中调用Python 使用 GCC编译并链接 Python 3.10 的共享库如何在C中获取和修改 sys.path 三、C语言调用无参python函数 四、C语言调用有参python函数 一、搭建编译环境 通过C语言调用Pyth…

联想Win11系统的任务栏格式调整为居中或居左

一 .目的 联想Win11系统的任务栏格式调整为居中或居左 二 .方法 2.1 鼠标任意放到电脑桌面位置&#xff0c;点击鼠标右键&#xff0c;显示后县级【显示设置】 2.2 个性化→任务栏→任务栏行为→对其方式&#xff1a;按需或个人习惯进行选择【靠左】 2.3 成功调整&#x…

查看libc版本

查看libc库版本 查看系统libc版本 $ ldd --version ldd (Ubuntu GLIBC 2.27-3ubuntu1.2) 2.27 Copyright (C) 2018 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or …

JDK8 TLS10 is not accepted

TLS 1.0/1.1 changes in OpenJDK and Amazon Corretto Affected OpenJDK versions: VersionRelease numberOpenJDK 88u292 and newerOpenJDK 1111.0.11 and newerOpenJDK 16 and aboveAll versions 《Amazon Corretto与OpenJDK的TLS 1.0和1.1弃用&#xff1a;影响与应对之策》…

Workplace Search 的演变:使用 Elasticsearch 搜索你的私人数据

作者&#xff1a;Dana Juratoni, Aditya Tripathi Workplace Search 功能将来将与 Elastic Search 合并。 这是你需要了解的内容。 生成式人工智能技术的最新进展为搜索带来了一系列可能性。 随着开发人员构建新的体验&#xff0c;用户正在采用新的搜索使用方式 —— 从用自然…

陌陌附近人打招呼脚本,可自动回复消息,按键精灵开源脚本

用按键写的一个陌陌自动打招呼发送指定话术消息的一个脚本&#xff0c;它还会检测对方的消息&#xff0c;然后自动回复指定信息&#xff0c;下面是UI界面和代码&#xff0c;你可以直接粘贴到自己的按键精灵里面运行&#xff0c;不会出错&#xff0c;已经测试过。 UI界面&#…

基于 selenium 实现网站图片采集

写在前面 有小伙伴选题&#xff0c;简单整理理解不足小伙伴帮忙指正 对每个人而言&#xff0c;真正的职责只有一个&#xff1a;找到自我。然后在心中坚守其一生&#xff0c;全心全意&#xff0c;永不停息。所有其它的路都是不完整的&#xff0c;是人的逃避方式&#xff0c;是对…

腾讯待办关停之后,如何提醒待办事项?

如果你之前使用腾讯待办这款小程序来记录待办事项并设置提醒&#xff0c;就会发现近日弹出的“业务关停通知”公告&#xff0c;由于业务方向调整&#xff0c;腾讯待办将于2023年的12月20日全面停止运营并下架&#xff0c;这表示以后无法继续使用了。但是腾讯待办关停之后&#…

别再吐槽大学教材了,来看看这些网友强推的数学神作!

前言 关于大学数学教材的吐槽似乎从来没停止过。有人慨叹&#xff1a;数学教材晦涩难懂。错&#xff01;难懂&#xff0c;起码还可以读懂。数学教材你根本读不懂&#xff1b;也有人说&#xff1a;数学教材简直就是天书。 数学教材有好有坏&#xff0c;这话不假&#xff0c;但更…

学会使用这个平台,教你制作出色的产品画册?

产品画册是企业和用户之间的桥梁&#xff0c;它可以第一时间给用户传递我们企业的最新产品信息。如何制作一本精美的产品画册呢&#xff1f; 这个不难&#xff0c;给大家推荐一款免费实用的在线制作工具FLBOOK &#xff0c;用这个平台可以轻松制作精美电子产品画册。 在制作产…

Python递归函数的定义和几个小例子

大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 如果有什么疑惑/资料需要的可以点击文章末尾名片领取源码 递归函数 &#xff08;1&#xff09;什么是递归函数&#xff1f; 我们都知道&#xff0c;一个函数可以调用其他函数。如果这个函数在内部调用它自己&#xff0c;那么这个…

纯前端模板文件下载如何精确控制下载的文件名字

在写项目的时候&#xff0c;遇到了一个需要把给定的文件放到页面中&#xff0c;然后用户点击下载按钮将这个文件下载下来&#xff0c;我将其存入了云服务之中(这个云服务是不会清空的&#xff0c;内存又不值几个钱)&#xff0c;但是当我下载的时候&#xff0c;下载的文件名是存…