测试开发技术网站
博客
设计
设计
开发
Python
测试
unittest
运维
Linux基础应用
CI/CD
CI/CD
数据库
数据库
云计算
云计算
云原生
云原生
爬虫
爬虫
数据分析
数据分析
人工智能
人工智能
登录
注册
JavaScript----JS下载文件重命名不生效即a.download修改文件名不生效的解决办法
收藏本文
作者:redrose2100 类别: 日期:2023-04-18 03:35:26 阅读:892 次 消耗积分:0 分
[【原文链接】JavaScript----JS下载文件重命名不生效即a.download修改文件名不生效的解决办法](http://devops-dev.com/article/580) # 问题分析 首先看如下一段js下载文件的代码,这里对link.download 进行了文件重命名,但是执行后发现重命名并未生效,这是因为这里的link.href与网站域名存在跨域了,当跨域时重命名会失效,会直接显示下载文件链接中的文件名。 ```js const link = document.createElement('a') link.download = file_name link.style.display = 'none' link.href = 'https://xxx.com/xxxxxx.rar' document.body.appendChild(link) link.click() URL.revokeObjectURL(link.href) document.body.removeChild(link) ``` # 解决办法 网上能查询到的一般提供如下两种方式,一种是如下方式,这种方式是可以实现文件重命名的,但是也存在一个问题,就是当文件比较大的时候,点击下载后没有任何反应,因为它是等待文件下载完成后才会在浏览器中显示下载进度条的。 ```js handleDownload(item) { var xml = new XMLHttpRequest(); xml.open('GET', item.fileUrl, true); xml.responseType = 'blob'; xml.onload = function () { var url = window.URL.createObjectURL(xml.response); var a = document.createElement('a'); a.href = url; a.download = item.fileName; a.click(); }; xml.send(); } ``` 还有一种方式就是类似如下方式,这种方式同样也是可以做到文件名重命名生效,但是同样存在当文件比较大时,点击下载按钮后要过很长时间才会显示出下载进度条,即首先将文件下载后才会在浏览器中显示出来。 ```js import axios from 'axios' downloadFile(item) { axios .get(item.fileUrl, { responseType: 'blob' }) .then(res => { const blob = new Blob([res.data]) const link = document.createElement('a') link.href = URL.createObjectURL(blob) link.download =item.fileName link.click() URL.revokeObjectURL(link.href) }) .catch(console.error) } ``` 显然这两种方式都不是最佳的解决方案,因此最好的解决方案是在设计之初就要考虑到这个问题,即直接将文件名作为网络存储的链接,即下载文件时无需修改文件名,那么此时就可以直接使用本文开头的下载js代码即可。 假如不幸在设计之初没有考虑到这个问题,即网络存储的文件链接可能存为一串随机字符串,但是下载时仍然希望显示出文件原有的名字,同时希望当点击下载按钮后立即弹出下载窗口,此时可以考虑在nginx中做一下反向代理,即配置一个和网站同源的一个域名,然后在设置一个二级域名,比如网站域名为 http://xxx.com, 则可以在nginx中设置一个类似 http://xxx.com/api 的二级域名,然后反向代理到当前跨域的存储域名上,这样再使用本文开头的下载文件的js代码时就不存在跨域的问题了。 如果前端是通过启动服务的方式,也可以在前端中将下载文件的接口通过配置api代理的方式在前端服务中配置,这样同样可以实现同源,即不存在跨域的问题,此时下载文件同样可以使用本文开头的js代码,即实现对下载文件的修改,同时又可以立刻弹出下载进度条
始终坚持开源开放共享精神,同时感谢您的充电鼓励和支持!
版权所有,转载本站文章请注明出处:redrose2100, http://blog.redrose2100.com/article/580
上一篇:
数据分析----IQR(Interquartile Range)四分位距的理解与应用及Python实现
下一篇:
印刷品-印刷产品规范
搜索
个人成就
出版书籍
《Pytest企业级应用实战》
测试开发技术全栈公众号
测试开发技术全栈公众号
DevOps技术交流微信群
加微信邀请进群
常用网站链接
开源软件洞察
云原生技术栈全景图
Python语言官方文档
Golang官方文档
Docker官方文档
Jenkins中文用户手册
Scrapy官方文档
VUE官方文档
Harbor官方文档
openQA官方文档
云原生开源社区
开源中国
Kubernetes中文文档
Markdown语法官方教程
Kubernetes中文社区
Kubersphere官方文档
BootStrap中文网站
JavaScript中文网
NumPy官方文档
Pandas官方文档
GitLink确实开源网站
数据库排名网站
编程语言排名网站
SEO综合查询网站
数学加减法练习自动生成网站
Kickstart Generator
文章分类
最新文章
最多阅读
特别推荐
×
Close
登录
注册
找回密码
登录邮箱:
登录密码:
图片验证码:
注册邮箱:
注册密码:
邮箱验证码:
发送邮件
注册邮箱:
新的密码:
邮箱验证码:
发送邮件