解决H5的a标签的download属性下载service上的文件出现跨域问题


Posted in HTML / CSS onJuly 16, 2019

1.通过点击下载多媒体文件(图片/视频/文件等)

最简单的方式:

<a href='url' download="filename.ext">下载文件</a>

如果url指向同源资源,是正常的。

如果url指向第三方资源,download会失效,表现和不使用download时一致——浏览器能打开的文件,浏览器会直接打开,不能打开的文件,会直接下载。浏览器打开的文件,可以手动下载。

解决方案一:将文件打包为.zip/.rar等浏览器不能打开的文件下载。

解决方案二:通过后端转发,后端请求第三方资源,返回给前端,前端使用file-saver等工具保存文件。

如果url指向的第三方资源配置了CORS,download属性无效,但可以获取文件下载到本地,无法修改修改文件名。

2.解决方法

1. 借助HTML5 Blob实现文本信息文件下载

const downloadRes = async (url, name) => {
    let response = await fetch(url)
    // 内容转变成blob地址
    let blob = await response.blob()
    // 创建隐藏的可下载链接
    let objectUrl = window.URL.createObjectURL(blob)
    let a = document.createElement('a')
    //地址
    a.href = objectUrl
    //修改文件名
    a.download = name
    // 触发点击
    document.body.appendChild(a)
    a.click()
    //移除
    setTimeout(() => document.body.removeChild(a), 1000)
}

2.图片格式

如果我们想下载一张图片,可以把这张图片转换成base64格式,然后下载。

```
export const downloadImg = async (url, name) => {
    var canvas = document.createElement('canvas'),
        ctx = canvas.getContext('2d'),
        img = new Image();
    img.crossOrigin = 'Anonymous';
    img.onload = function() {
        canvas.height = img.height;
        canvas.width = img.width;
        ctx.drawImage(img, 0, 0);
        var dataURL = canvas.toDataURL('image/png');
        let a = document.createElement('a');
        a.href = dataURL;
        a.download = name;
        document.body.appendChild(a);
        a.click();
        setTimeout(() => {
            document.body.removeChild(a);
            canvas = null;
        }, 1000);
    };
    img.src = url;
};
```

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

HTML / CSS 相关文章推荐
CSS3伪类选择器:nth-child()
Apr 02 HTML / CSS
CSS3 Media Queries详细介绍和使用实例
May 08 HTML / CSS
HTML5 Canvas图像模糊完美解决办法
Feb 06 HTML / CSS
html5指南-2.如何操作document metadata
Jan 07 HTML / CSS
Html5 web本地存储实例详解
Jul 28 HTML / CSS
HTML5为输入框添加语音输入功能的实现方法
Feb 06 HTML / CSS
canvas如何绘制钟表的方法
Dec 13 HTML / CSS
HTML5声音录制/播放功能的实现代码
May 03 HTML / CSS
HTML5拖拽功能实现的拼图游戏
Jul 31 HTML / CSS
canvas学习和滤镜实现代码
Aug 22 HTML / CSS
Html分层的box-shadow效果的示例代码
Mar 30 HTML / CSS
flex弹性布局详解
Mar 20 HTML / CSS
html通过canvas转成base64的方法
Jul 18 #HTML / CSS
基于Canvas+Vue的弹幕组件的实现
Jul 23 #HTML / CSS
HTML5 WebGL 实现民航客机飞行监控系统
Jul 25 #HTML / CSS
关于前端上传文件全面基础扫盲贴(入门)
Aug 01 #HTML / CSS
把富文本的回车转为br标签
Aug 09 #HTML / CSS
浅谈cookie和localStorage那些事
Aug 27 #HTML / CSS
HTML5实时语音通话聊天MP3压缩传输3KB每秒
Aug 28 #HTML / CSS
You might like
用PHP的超级变量$_GET获取HTML表单(Form) 数据
2011/05/07 PHP
第三章 php操作符与控制结构代码
2011/12/30 PHP
PHP使用Memcache时模拟命名空间及缓存失效问题的解决
2016/02/27 PHP
JavaScript中使用replace结合正则实现replaceAll的效果
2010/06/04 Javascript
JavaScript 高级篇之闭包、模拟类,继承(五)
2012/04/07 Javascript
运算符&amp;&amp;的三个不同层次
2013/04/07 Javascript
基于jquery插件实现拖拽删除图片功能
2020/08/27 Javascript
下一代Bootstrap的5个特点 超酷炫!
2016/06/17 Javascript
jQuery文字提示与图片提示效果实现方法
2016/07/04 Javascript
JS实现的相册图片左右滚动完整实例
2016/11/23 Javascript
Node.js v8.0.0正式发布!看看带来了哪些主要新特性
2017/06/02 Javascript
JS实现的input选择图片本地预览功能示例
2018/08/29 Javascript
如何用Node写页面爬虫的工具集
2018/10/26 Javascript
JS实现滚动条触底加载更多
2019/09/19 Javascript
python rsa 加密解密
2017/03/20 Python
在Python程序员面试中被问的最多的10道题
2017/12/05 Python
Python使用functools实现注解同步方法
2018/02/06 Python
Python从ZabbixAPI获取信息及实现Zabbix-API 监控的方法
2018/09/17 Python
如何使用Python进行OCR识别图片中的文字
2019/04/01 Python
Python面向对象之继承和多态用法分析
2019/06/08 Python
Python 获取命令行参数内容及参数个数的实例
2019/12/20 Python
Python基于模块Paramiko实现SSHv2协议
2020/04/28 Python
Python+Appium实现自动化清理微信僵尸好友的方法
2021/02/04 Python
新秀丽官方旗舰店:Samsonite拉杆箱、双肩包、皮具
2018/03/05 全球购物
澳大利亚排名第一的儿童在线玩具商店:Toy Galaxy
2018/10/06 全球购物
全球性的在线商店:Vogca
2019/05/10 全球购物
python+selenium小米商城红米K40手机自动抢购的示例代码
2021/03/24 Python
成龙霸王洗发水广告词
2014/03/14 职场文书
教师节促销方案
2014/03/22 职场文书
向国旗敬礼活动总结
2014/09/27 职场文书
2015年安全生产责任书
2015/01/30 职场文书
酒店开业主持词
2015/07/02 职场文书
教师节表彰会主持词
2015/07/06 职场文书
北京大学中文系教授推荐的10本小说
2019/08/08 职场文书
浅谈Python 中的复数问题
2021/05/19 Python
python工具dtreeviz决策树可视化和模型可解释性
2022/03/03 Python