Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 1579|回复: 0

[默认分类] 【JavaScript】使用url下载文件,解决chrome浏览器自动识别图片打开问题。

[复制链接]
  • TA的每日心情
    开心
    2021-12-13 21:45
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    发表于 2020-8-1 09:01:30 | 显示全部楼层 |阅读模式
    前两天做的一个文件下载,使用文件存储地址url去下载,不需要打开文件。使用新建a标签,触发点击事件来进行下载。

    1. downloadNormalFile(src, filename) {
    2.                 var link = document.createElement("a");
    3.                 link.setAttribute("download", filename);
    4.                 link.href = src;
    5.                 document.body.appendChild(link);//添加到页面中,为兼容Firefox浏览器
    6.                 link.click();
    7.                 document.body.removeChild(link);//从页面移除
    8.             },
    复制代码


    新建a标签,设置href为文件存储地址,添加HTML5的新属性download,然后触发a标签的click事件即可。但是在火狐浏览器中a标签需要添加到页面中才能触发事件下载。所以添加到body中后又移除。


      
    上面是通常情况下的做法,我遇到一个问题,在chrome浏览器中当文件是图片时,浏览器不会下载,而是打开图片链接显示。网上查找了很多方法,采用将utl转换为base64格式,然后触发下载,这样浏览器不会自动识别url打开显示。

    1. ImgtodataURL(url, filename, fileType) {
    2.                 this.getBase64(url, fileType, (_baseUrl) => {
    3.                     // 创建隐藏的可下载链接
    4.                     var eleLink = document.createElement("a");
    5.                     eleLink.download = filename;
    6.                     eleLink.style.display = "none";
    7.                     // 图片转base64地址
    8.                     eleLink.href = _baseUrl;
    9.                     // 触发点击
    10.                     document.body.appendChild(eleLink);
    11.                     eleLink.click();
    12.                     // 然后移除
    13.                     document.body.removeChild(eleLink);
    14.                 });
    15.             },
    16.             getBase64(url, fileType, callback) {
    17.                 //通过构造函数来创建的 img 实例,在赋予 src 值后就会立刻下载图片
    18.                 var Img = new Image(),
    19.                     dataURL = "";
    20.                 Img.src = url;
    21.                 Img.setAttribute("crossOrigin", "Anonymous");
    22.                 Img.onload = function () { //要先确保图片完整获取到,这是个异步事件
    23.                     var canvas = document.createElement("canvas"), //创建canvas元素
    24.                         width = Img.width, //确保canvas的尺寸和图片一样
    25.                         height = Img.height;
    26.                     canvas.width = width;
    27.                     canvas.height = height;
    28.                     canvas.getContext("2d").drawImage(Img, 0, 0, width, height); //将图片绘制到canvas中
    29.                     dataURL = canvas.toDataURL("image/" + fileType); //转换图片为dataURL
    30.                     callback ? callback(dataURL) : null;
    31.                 };
    32.             }
    复制代码


    getbase64采用canvas绘制图片后采用callback方法调用异步加载onload方法获取到的dataurl,然后再新建a标签触发下载。
      


      
    到上一步,基本解决了问题,但是在Edge浏览器中,下载图片报错了。
    SCRIPT5022: SecurityError
      
    因为在Edge中浏览器用户代理值为:

    包含chrome,所以在判断浏览器的时候将Edge浏览器也判断为了chrome浏览器,执行了getbase64转换了url。故作判断时需要排除这种情况。

    1. isImageInChromeNotEdge(fType) {
    2.                 let bool = false;
    3.                 if (window.navigator.userAgent.indexOf("Chrome") !== -1 && window.navigator.userAgent.indexOf("Edge") === -1)
    4.                     (fType === "jpg" || fType === "gif" || fType === "png" || fType === "bmp" || fType === "jpeg" || fType === "svg") && (bool = true);
    5.                     return bool;
    6.             },
    复制代码


    最后从获取到url后下载的操作完整代码为:

    1.     download(src,row){    //row.ITEMNAME为文件名称,src为文件存储地址            
    2.         if (this.isImageInChromeNotEdge(fType)) {//判断是否为chrome里的图片
    3.                     this.ImgtodataURL(src, row.ITEMNAME, fType);
    4.                 } else {
    5.                     this.downloadNormalFile(src, row.ITEMNAME);
    6.                 }
    7.             },
    8.             isImageInChromeNotEdge(fType) {
    9.                 let bool = false;
    10.                 if (window.navigator.userAgent.indexOf("Chrome") !== -1 && window.navigator.userAgent.indexOf("Edge") === -1)
    11.                     (fType === "jpg" || fType === "gif" || fType === "png" || fType === "bmp" || fType === "jpeg" || fType === "svg") && (bool = true);
    12.                     return bool;
    13.             },
    14.             downloadNormalFile(src, filename) {
    15.                 var link = document.createElement("a");
    16.                 link.setAttribute("download", filename);
    17.                 link.href = src;
    18.                 document.body.appendChild(link);//添加到页面中,为兼容Firefox浏览器
    19.                 link.click();
    20.                 document.body.removeChild(link);//从页面移除
    21.             },
    22.             ImgtodataURL(url, filename, fileType) {
    23.                 this.getBase64(url, fileType, (_baseUrl) => {
    24.                     // 创建隐藏的可下载链接
    25.                     var eleLink = document.createElement("a");
    26.                     eleLink.download = filename;
    27.                     eleLink.style.display = "none";
    28.                     // 图片转base64地址
    29.                     eleLink.href = _baseUrl;
    30.                     // 触发点击
    31.                     document.body.appendChild(eleLink);
    32.                     eleLink.click();
    33.                     // 然后移除
    34.                     document.body.removeChild(eleLink);
    35.                 });
    36.             },
    37.             getBase64(url, fileType, callback) {
    38.                 //通过构造函数来创建的 img 实例,在赋予 src 值后就会立刻下载图片
    39.                 var Img = new Image(),
    40.                     dataURL = "";
    41.                 Img.src = url;
    42.                 Img.setAttribute("crossOrigin", "Anonymous");
    43.                 Img.onload = function () { //要先确保图片完整获取到,这是个异步事件
    44.                     var canvas = document.createElement("canvas"), //创建canvas元素
    45.                         width = Img.width, //确保canvas的尺寸和图片一样
    46.                         height = Img.height;
    47.                     canvas.width = width;
    48.                     canvas.height = height;
    49.                     canvas.getContext("2d").drawImage(Img, 0, 0, width, height); //将图片绘制到canvas中
    50.                     dataURL = canvas.toDataURL("image/" + fileType); //转换图片为dataURL
    51.                     callback ? callback(dataURL) : null;
    52.                 };
    53.             }
    复制代码


    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-4-26 19:26 , Processed in 0.360452 second(s), 37 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表