如果使用a标签指向一个图片的话,你会发现点击链接时它会直接在浏览器中打开图片并显示:

<a href="http://www.baidu.com/img/baidu_jgylogo3.gif" />

但是这样的话,就存在一个问题,如果我想点击a链接直接下载图片到本地,该怎么实现呢?
在查阅资料之后,发现a标签有一个download的属性,添加了该属性,a标签将直接下载文件,并根据download属性的值设置下载文件的文件名,不为download属性设置值则文件将以默认文件名下载:

<!-- 文件名为默认名称 -->
<a href="./baidu_jgylogo3.gif" download />
<!-- 文件名为baidu.gif -->
<a href="./baidu_jgylogo3.gif" download="baidu" />
<!-- 文件名为baidu.png -->
<a href="./baidu_jgylogo3.gif" download="baidu.png" />

但是这个办法有一个弊端,它仅支持同源链接下载,非同源链接还是会直接打开图片:

<!-- 同源链接能下载图片 -->
<a href="./baidu_jgylogo3.gif" download />
<!-- 非同源链接download属性会无效,浏览器会直接打开图片 -->
<a href="http://www.baidu.com/img/baidu_jgylogo3.gif" download />

尝试了将图片转成Base64或者Blob的办法:

function downloadImgByBlob(url) {var img = new Image()img.onload = function() {var canvas = document.createElement('canvas')canvas.width = img.widthcanvas.height = img.heightvar ctx = canvas.getContext('2d')// 将img中的内容画到画布上ctx.drawImage(img, 0, 0, canvas.width, canvas.height)// 将画布内容转换为Blobcanvas.toBlob((blob) => {// blob转为同源urlvar blobUrl = window.URL.createObjectURL(blob)// 创建a链接var a = document.createElement('a')a.href = blobUrla.download = ''// 触发a链接点击事件,浏览器开始下载文件a.click()})}
img.src = url
// 必须设置,否则canvas中的内容无法转换为blob
img.setAttribute('crossOrigin', 'Anonymous')
}function downloadImgByBase64(url) {var img = new Image()img.onload = function() {var canvas = document.createElement('canvas')canvas.width = img.widthcanvas.height = img.heightvar ctx = canvas.getContext('2d')// 将img中的内容画到画布上ctx.drawImage(img, 0, 0, canvas.width, canvas.height)// 将画布内容转换为base64var base64 = canvas.toDataURL()// 创建a链接var a = document.createElement('a')a.href = base64a.download = ''// 触发a链接点击事件,浏览器开始下载文件a.click()}img.src = url// 必须设置,否则canvas中的内容无法转换为base64img.setAttribute('crossOrigin', 'Anonymous')
}

boom

上述两种方法效果都不太理想。因为这两种方法仅支持生成jpeg和png格式图片。如果是gif图,仅能显示第一帧的内容。
后来在download.js官网中看到了如下的示例:

var x=new XMLHttpRequest();x.open("GET", "https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=1986179278,1118313821&fm=27&gp=0.jpg", true);x.responseType = 'blob';x.onload=function(e){download(x.response, "dlBinAjax.gif", "image/gif" ); }x.send();

该示例的思路是,通过XMLHttpRequest()请求图片链接,然后获取返回的Blob。那结合上面下载图片的方法,就能下载图片了:

var x=new XMLHttpRequest();x.open("GET", "https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=1986179278,1118313821&fm=27&gp=0.jpg", true);x.responseType = 'blob';x.onload=function(e){var url = window.URL.createObjectURL(x.response)var a = document.createElement('a');a.href = urla.download = ''a.click()}x.send();

通过这种方法下载图片,gif图也能够显示正常了。
注意,上述方法能够兼容大部分浏览器,但是不兼容IE浏览器(不支持download属性)。要兼容IE浏览器需要用其他办法。
下载的链接好像要是https的才行 (我下载的都是https的图片)

HTML+JS实现浏览器下载图片 (可以下载第三方链接的图片)相关推荐

  1. 图片怎么变成html链接,HTML图片怎么超链接

    0 回答 2021-05-06 浏览:0 分类:其他问题 1 回答 2021-05-06 浏览:0 分类:其他问题 回答: 2 回答 2021-05-06 浏览:0 分类:其他问题 回答:超链接的代码 ...

  2. js禁用浏览器 pdf 打印、下载功能(pdf.js 禁用打印下载、功能)

    前端实现 pdf 预览方法 (1)用iframe标签src="文件地址"就可以直接打开,还可以设置width,height等属性.具体参考iframe属性. <iframe ...

  3. html图片自动移动代码是什么,html图片滚动代码

    html图片向左无缝隙循环滚动代码 向左或向右都可以,无缝隙循环滚动,麻烦请给完整代码,5张图片图片大小用css3实现循环滚动效果: css: #wrap{ width: 200px; height: ...

  4. 【Chrome】图片批量下载扩展zzllrr Imager小乐图客V1.4 (支持正则表达式、自定义JS代码、自定义引擎、多网站取图规则)...

    小乐图客 - Chrome浏览器图片批量下载工具,升级至V1.4 该版本实现的功能: 1.右下角集成众多网站引擎(相似图片搜索.图片搜索.网页搜索.图片上传等等). 2.选项中增加各类设置的重置.导入 ...

  5. 图片上传时,QQ浏览器会弹出下载弹框的解决方案

    在做这次的欢乐购车季项目中,出现了一个以前没有遇到的问题,就是点击上传按钮,QQ浏览器会弹出下载框,非常讨厌.从网上查了很多资料,虽然大家对QQ浏览器带给前端的麻烦是深恶痛绝,但是没办法,还得想办法解 ...

  6. js如何在浏览器中运行php文件下载,JavaScript_用JS在浏览器中创建下载文件,但受限于浏览器,很多情况下 - phpStudy...

    用JS在浏览器中创建下载文件 但受限于浏览器,很多情况下我们都只能给出个链接,让用户点击打开->另存为.如下面这个链接: file.js 用户点击这个链接的时候,浏览器会打开并显示链接指向的文件 ...

  7. js进行图片本地下载(多张打包,单张)

    js进行图片本地下载 这里我分两种一种是单张图片下载比较简单,另外一种是打包图片下载 批量图片下载 import JSZip from "jszip"; import FileSa ...

  8. JS在浏览器上的性能分析(一)脚本的下载与运行

    JS在浏览器上的性能分析(一)脚本的下载与运行 前言 JS在浏览器上的性能,可以认为是开发者所面临的最严重的可用性问题.JS的阻塞特性使得浏览器在执行JS代码时不能同时做其他任何事情,而大多数浏览器使 ...

  9. Node.js aitaotu图片批量下载Node.js爬虫1.00版

    即使是https网页,解析的方式也不是一致的,需要多试试. 代码: //====================================================== // aitaot ...

最新文章

  1. Swift标准库源码阅读笔记 - Array和ContiguousArray
  2. CentOS7.5下时间戳转换为时间
  3. 程序员Web面试之JSON
  4. Java调用动态库 缺点_java调用动态库(dll)的一些问题
  5. oracle强制走索引_实验验证:Oracle聚簇因子对索引使用的影响
  6. # 2017-2018-1 20155336《信息安全技术》实验二——Windows口令破解
  7. 手把手图文教你从Eclipse项目迁移Android Studio
  8. 批处理 文件名字前面加前缀或者后缀
  9. 基于 FFMPEG 的视频解码(libavcodec ,致敬雷霄骅)
  10. matlab抛物柱面 y 2=2x,求曲面z=根号(x2+y2)被柱面z2=2x割下部分的面积
  11. JDK1.5版本新增特性
  12. 自然语言处理 朴素贝叶斯文本分类
  13. i12蓝牙耳机怎么设置成中文_耳朵里的小精灵——乐迈车载智能蓝牙耳机
  14. 【python与数据分析】实验八——图像批量添加数字水印及实现模拟转盘抽奖游戏
  15. 使用计算机怎样制表格,如何在电脑上制作简单的表格?
  16. Android的Logcat命令详解:翻译Enabling logcat Logging
  17. iOS 通过定位获取常驻后台
  18. 计算机系统如何恢复出厂设置路由器,路由器恢复出厂设置的具体操作步骤-电脑自学网...
  19. 用于Arduino的S4A图形化编程图文详解
  20. 初中英语知识水平测试软件,初中英语学科知识与能力模拟测试七

热门文章

  1. 新加坡计算机金融专业,新加坡金融专业为何如此热门?
  2. AcWing 算法基础课第三节基础算法3 双指针、位运算、离散化、区间合并
  3. 安纳西(武汉)全铝智能家居 实力厂家 高端品牌
  4. 更新安全补丁后无法读取查询导入Excel问题解决说明书
  5. 七巧板 html5游戏开发,纯HTML5绘制的七巧板
  6. 计算机相关实用新型专利,计算机类实用新型专利有哪些转让
  7. Python周刊507期
  8. WebService入门一、Hello WebService
  9. 湿度控制器的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  10. Kaggle_NCFM鱼品种识别