解决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常用功能的写法
Jun 05 HTML / CSS
实例讲解使用CSS实现多边框和透明边框的方法
Sep 08 HTML / CSS
HTML5 WebGL 实现民航客机飞行监控系统
Jul 25 HTML / CSS
html5 css3网站菜单实现代码
Dec 23 HTML / CSS
html5本地存储之localstorage 、本地数据库、sessionStorage简单使用示例
May 08 HTML / CSS
完美解决IE8下不兼容rgba()的问题
Mar 31 HTML / CSS
localStorage的过期时间设置的方法详解
Nov 26 HTML / CSS
浅谈HTML5新增和废弃的标签
Apr 28 HTML / CSS
详解通过focusout事件解决IOS键盘收起时界面不归位的问题
Jul 18 HTML / CSS
浅析数据存储的三种方式 cookie sessionstorage localstorage 的异同
Jun 04 HTML / CSS
position:sticky 粘性定位的几种巧妙应用详解
Apr 24 HTML / CSS
用position:sticky完美解决小程序吸顶问题的实现方法
Apr 24 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常用函数和常见疑难问题解答
2014/03/05 PHP
实例讲解PHP面向对象之多态
2014/08/20 PHP
php实现mysql数据库分表分段备份
2015/06/18 PHP
ThinkPHP中create()方法自动验证表单信息
2017/04/28 PHP
PHP抽象类基本用法示例
2018/12/28 PHP
php中pcntl_fork创建子进程的方法实例
2019/03/14 PHP
如何让easyui gridview 宽度自适应窗口改变及fitColumns应用
2013/01/25 Javascript
模拟电子签章盖章效果的jQuery插件源码
2013/06/24 Javascript
jQuery 写的简单打字游戏可以提示正确和错误的次数
2014/07/01 Javascript
JavaScript中的原型和继承详解(图文)
2014/07/18 Javascript
JavaScript中几种排序算法的简单实现
2015/07/29 Javascript
javascript实现状态栏中文字动态显示的方法
2015/10/20 Javascript
JS正则验证多个邮箱完整实例【邮箱用分号隔开】
2017/04/19 Javascript
React复制到剪贴板的示例代码
2017/08/22 Javascript
mac中利用NVM管理不同node版本的方法详解
2017/11/08 Javascript
js自定义input文件上传样式
2018/10/26 Javascript
详解vue2.0 资源文件assets和static的区别
2018/11/27 Javascript
vue中如何添加百度统计代码
2020/12/19 Vue.js
JS相册图片抖动放大展示效果的示例代码
2021/01/29 Javascript
Python常用小技巧总结
2015/06/01 Python
Python中线程编程之threading模块的使用详解
2015/06/23 Python
通过源码分析Python中的切片赋值
2017/05/08 Python
python opencv实现任意角度的透视变换实例代码
2018/01/12 Python
Python2.7环境Flask框架安装简明教程【已测试】
2018/07/13 Python
Django restframework 源码分析之认证详解
2019/02/22 Python
如何通过命令行进入python
2020/07/06 Python
Gibson London官网:以地道的英国男装而著称
2019/12/06 全球购物
Traffic People官网:女式花裙、上衣和连身裤
2020/10/12 全球购物
汽车专业毕业生推荐信
2013/11/12 职场文书
西北政法大学自主招生自荐信
2014/01/29 职场文书
工程安全员岗位职责
2014/03/09 职场文书
运动会方阵口号
2014/06/07 职场文书
论群众路线学习心得体会
2014/10/31 职场文书
淘宝文案策划岗位职责
2015/04/14 职场文书
毕业设计致谢词
2015/05/14 职场文书
python可视化大屏库big_screen示例详解
2021/11/23 Python