解决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的Media Queries(跨平台设计)
Jul 27 HTML / CSS
CSS3 选择器 基本选择器介绍
Jan 21 HTML / CSS
使用Filters滤镜弥补CSS3的跨浏览器问题以及兼容低版本IE
Jan 23 HTML / CSS
8款使用 CSS3 实现超炫的 Loading(加载)的动画效果
Mar 17 HTML / CSS
HTML5之SVG 2D入门9—蒙板及mask元素介绍与应用
Jan 30 HTML / CSS
html5配合css3实现带提示文字的输入框(摆脱js)
Mar 08 HTML / CSS
HTML5如何为形状图上颜色怎么绘制具有颜色和透明度的矩形
Jun 23 HTML / CSS
HTML页面中添加Canvas标签示例
Jan 01 HTML / CSS
用HTML5实现鼠标滚轮事件放大缩小图片的功能
Jun 25 HTML / CSS
ivx平台开发之不用代码实现一个九宫格抽奖功能
Jan 27 HTML / CSS
巧用 -webkit-box-reflect 倒影实现各类动效(小结)
Apr 22 HTML / CSS
html+css实现环绕倒影加载特效
Jul 07 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
基于mysql的bbs设计(五)
2006/10/09 PHP
PHP insert语法详解
2008/06/07 PHP
用PHP读取RSS feed的代码
2008/08/01 PHP
IIS6+PHP5+MySQL5+Zend Optimizer+phpMyAdmin安装配置图文教程 2009年
2009/06/08 PHP
PHP开发框架Laravel数据库操作方法总结
2014/09/03 PHP
PHP调用MySQL存储过程并返回值的方法
2014/12/26 PHP
PHP安装memcached扩展笔记
2015/05/28 PHP
PHP使用自定义方法实现数组合并示例
2016/07/07 PHP
php常用数组array函数实例总结【赋值,拆分,合并,计算,添加,删除,查询,判断,排序】
2016/12/07 PHP
PHP使用Redis替代文件存储Session的方法
2017/02/15 PHP
PHP 实现 JSON 数据的编码和解码操作详解
2020/04/22 PHP
Jquery 高亮显示文本中重要的关键字
2009/12/24 Javascript
js对象的比较
2011/02/26 Javascript
自己做的模拟模态对话框实现代码
2012/05/23 Javascript
javascript中call apply 的应用场景
2015/04/16 Javascript
javascript实现的简单计时器
2015/07/19 Javascript
基于BootStrap的图片轮播效果展示实例代码
2016/05/23 Javascript
Bootstrap Table表格一直加载(load)不了数据的快速解决方法
2016/09/17 Javascript
Array数组对象中的forEach、map、filter及reduce详析
2018/08/02 Javascript
layUI实现前端分页和后端分页
2019/07/27 Javascript
vue中音频wavesurfer.js的使用方法
2020/02/20 Vue.js
Js逆向实现滑动验证码图片还原的示例代码
2020/03/10 Javascript
[28:05]完美世界DOTA2联赛循环赛Inki vs DeMonsTer 第一场 10月30日
2020/10/31 DOTA
Python环境下搭建属于自己的pip源的教程
2016/05/05 Python
Python OpenCV获取视频的方法
2018/02/28 Python
pandas 根据列的值选取所有行的示例
2018/11/07 Python
Python将文字转成语音并读出来的实例详解
2019/07/15 Python
先进员工获奖感言
2014/08/14 职场文书
2014幼儿园大班工作总结
2014/11/10 职场文书
学生个人评语大全
2015/01/04 职场文书
处罚决定书范文
2015/06/24 职场文书
Go语言切片前或中间插入项与内置copy()函数详解
2021/04/27 Golang
Pycharm 如何设置HTML文件自动补全代码或标签
2021/05/21 Python
Go 语言下基于Redis分布式锁的实现方式
2021/06/28 Golang
JavaScript实现简单拖拽效果
2021/09/15 Javascript
用Python实现屏幕截图详解
2022/01/22 Python