前端快速实现点击图片下载

目录

方法一:同源使用标签下载图片

方法二:跨域使用将canvas上的内容转换为Blob对象并下载


在前端开发中,有时候我们需要实现点击图片后直接下载的功能。本文将介绍两种方法来实现这一功能:

  • 同源使用<a>标签下载图片
  • 跨域使用将canvas上的内容转换为Blob对象并下载。

方法一:同源使用<a>标签下载图片

同源情况下,我们可以通过创建一个<a>标签,设置其href属性为图片的链接,然后设置download属性为图片的文件名,就可以实现点击图片下载的功能。

<a href="image.jpg" download="image.jpg"><img src="image.jpg" alt="Image">
</a>

但当出现请求下载资源跨域时这个方法就不能实现效果了

方法二:跨域使用将canvas上的内容转换为Blob对象并下载

跨域情况下,由于浏览器的安全策略限制,直接下载图片可能会受到限制。我们可以通过将图片绘制到canvas上,然后将canvas上的内容转换为Blob对象,最后通过创建<a>标签来实现下载。

代码中有详细注释:

// 接收一个图片链接作为参数
function download(link: string) {// 创建新的图片对象const img = new Image()// 设置图片跨域属性为匿名img.setAttribute('crossOrigin', 'Anonymous')// 图片加载完成后执行回调函数img.onload = function () {// 创建一个新的画布元素const canvas = document.createElement('canvas')// 获取画布的2D上下文const context = canvas.getContext('2d')// 判断是否成功获取到画布上下文if (context) {// 设置画布的宽度和高度与图片一致canvas.width = img.widthcanvas.height = img.height// 在画布上绘制图片context.drawImage(img, 0, 0, img.width, img.height)// 将画布内容转换为 Blob 对象canvas.toBlob((blob) => {// 判断是否成功生成 Blob 对象if (blob) {// 创建一个临时链接用于下载const url = URL.createObjectURL(blob)const a = document.createElement('a')const event = new MouseEvent('click')// 设置下载的文件名a.download = 'default.png'// 设置链接地址为 Blob 对象的 URLa.href = url// 模拟点击事件触发下载a.dispatchEvent(event)// 释放 Blob 对象的 URLURL.revokeObjectURL(url)} else {console.error('生成 Blob 失败')}})} else {console.error('获取 Canvas 上下文失败')}}// 设置图片的 src 属性,并在链接后添加时间戳以避免缓存img.src = `${link}?v=${Date.now()}`
}

注:

在canvas中绘制了来自其他域名的图片时,浏览器会认为这个canvas被“污染”(tainted),即受到了跨域限制。在这种情况下,浏览器会禁止使用toBlob()方法导出这个canvas作为Blob对象。

为了解决这个问题,可以在加载图片时设置图片的crossOrigin属性为'Anonymous',这样就可以避免跨域问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/763845.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安卓面试题多线程 121-125

121. 简述当一个线程进入某个对象的一个 synchronized 的实例方 法后,其它线程是否可进入此对象的其它方法 ?如果其他方法没有 synchronized 的话,其他线程是可以进入的。 所以要开放一个线程安全的对象时,得保证每个方法都是线程安全的122. 简述乐观锁和悲观锁的理解及如何…

C++概述

目录 一、C关键字&#xff08;63个&#xff09; 二、C几个关键点&#xff1a; 三、C语言缺陷一&#xff1a;命名冲突 四、C新概念&#xff1a;命名空间&#xff08;namespace&#xff09; 五、命名空间的嵌套&#xff1a; 六、展开命名空间&#xff1a;&#xff08;using …

切面类、注解、自定义切面类、自定义注解、如何通过注解实现切面类

1. 注解和切面类之间的关系 注解和切面类通常是配合使用的&#xff1a; 注解&#xff1a;用来标记代码&#xff0c;声明某个方法或类需要被特定的切面逻辑所增强。切面类&#xff1a;包含增强逻辑&#xff0c;它通过"切点"&#xff08;Pointcut&#xff09;来匹配被…

独家,澳门地区倾斜摄影OSGB数据免费领取

上一篇文章分享了如何将谷歌倾斜摄影原始数据如何转换成3DTiles的几种思路&#xff0c;并说明谷歌倾斜摄影3DTiles转换工具的技术先进性&#xff0c;同时也对谷歌倾斜摄影转换OSGB的几种技术思路做了对比&#xff0c;根据对比可知&#xff0c;谷歌倾斜摄影OSGB转换工具在生产效…

【No.14】蓝桥杯贪心法|最少硬币问题|活动安排问题(4)|翻硬币|快乐司机|防御力|答疑(C++)

算法优点 容易理解&#xff1a;生活常见 操作简单&#xff1a;在每一步都选局部最优 效率高&#xff1a;复杂度常常是O(1)的 算法缺点 局部最优不一定是全局最优 贪心算法&#xff08;Greedy algorithm&#xff09;&#xff0c;又称贪婪算法。是一种在每一步选择中都采取在…

小红书离线数仓提效新思路,提升百倍回刷性能

数据处理效率一直是大数据时代的核心话题&#xff0c;它推动着各类数据执行引擎持续迭代产品。从早期的 MapReduce&#xff0c;到今天的 Spark&#xff0c;各行业正不断演进其离线数仓技术架构。 现有以 Spark 为核心的数仓架构在处理大规模数据回刷方面已取得进展&#xff0c;…

专栏订阅-线上答疑通知

由于近期有很多大一的同学已经快速的做完了学院要求的9个lab&#xff0c;并且开始准备project。对于project存在很多问题。同时大部分的同学对制作小车非常的感兴趣&#xff0c;但又不知从何下手。博主针对于上述问题&#xff0c;将会在四月中旬左右开展一次统一的线上答疑&…

(vue)el-card区分背景图片、点击进入对应页面

(vue)el-card区分背景图片、点击进入对应页面 项目背景&#xff1a;郑州院XX项目首页-工作台模块卡片点击可 快速进入对应页面 html <div class"board-card"><el-cardv-for"(item, index) of cardList":key"index"class"board-ca…

【二】【单片机】有关独立按键的实验

自定义延时函数Delay 分别用Delay.c文件存储Delay函数。用Delay.h声明Delay函数。每次将这两个文件复制到工程中&#xff0c;直接使用。 //Delay.c void Delay(unsigned int xms) //11.0592MHz {while(xms--){unsigned char i, j;i 2;j 199;do{while (--j);}…

[Linux]条件变量:实现线程同步(什么是条件变量、为什么需要条件变量,怎么使用条件变量(接口)、例子,代码演示(生产者消费者模式))

目录 一、条件变量 1.什么是条件变量 故事说明 2、为什么需要使用条件变量 竞态条件 3.什么是同步 饥饿问题 二、条件变量的接口 1.pthread_cond_t 2.初始化&#xff08;pthread_cond_init&#xff09; 3.销毁&#xff08;pthread_cond_destroy&#xff09; 4.等待&…

知识碎片-Java编程思想-接口篇

引言 本文是 OnJava 接口部分的学习笔记。 结论 “优先使用类而不是接口”。 从类设计开始&#xff0c;如果很明显接口是必要的&#xff0c;那么就重构。任何抽象都应该由真正的需求来驱动。接口应该是酒必要时用来重构的东西&#xff0c;而不是在任何地方都多加一个间接层级&…

阿里云2核4G服务器租用价格和性能测评

阿里云2核4G服务器租用优惠价格&#xff0c;轻量2核4G服务器165元一年、u1服务器2核4G5M带宽199元一年、云服务器e实例30元3个月&#xff0c;活动链接 aliyunfuwuqi.com/go/aliyun 活动链接如下图&#xff1a; 阿里云2核4G服务器优惠价格 轻量应用服务器2核2G4M带宽、60GB高效…

推免保研夏令营/预推免面试—东南网安

0x00简述 0x01 面试经历 0x02 相关资料下载 0x00简述 0x01 面试经历 0x02 相关资料下载 挖坑待写

Vue3 Vite3 状态管理 pinia 基本使用、持久化、在路由守卫中的使用

参考https://juejin.cn/post/7152774411571953677&#xff0c;自己简洁化了一部分 1.安装pinia依赖 yarn add pinia 创建pini实例 根目录创建store文件夹&#xff0c;然后创建index.js import { createPinia } from piniaconst pinia createPinia()export default pinia …

如何使用人工智能和ChatGPT来优化营销转化率

人工智能 &#xff08;AI&#xff09; 和营销的交集正在彻底改变企业与客户互动的方式&#xff0c;最终改变营销转化率。人工智能能够分析大量数据、理解模式和自动执行任务&#xff0c;它不仅是一项创新技术&#xff0c;而且是营销领域的根本性转变。这种转变允许更加个性化、…

【计算机毕业设计】ssm073基于Word自动出题系统

基于Word自动出题系统 操作系统: Windows XP或Windows 7 开发工具: myeclipse 数据库: MySQL 系统研究目的及意义&#xff1a; 本课题研究通过信息化的手段进行对试题的出题工作&#xff0c;实现更加有效便捷的试题的编写和试卷的生成。这样不仅可以最大程度上较少学校教研工作…

NacosException: http error, code=403、NacosimeException——报错解决方法【Nacos2.x】

1、NacosException报错内容为&#xff1a; NacosException: http error, code403,msguser not found!,dataIdapplication-dev.yml,groupDEFAULT_GROUP,tenant连不上是因为成功开启鉴权后&#xff0c;所使用的Spring Cloud服务被拦截&#xff0c;需要在配置中添加Nacos用户名和…

年龄危机的七个来源

1&#xff09;后生可畏 我们70后是相对幸运的&#xff0c;50后、60后知识结构往往会有欠缺&#xff0c;比如没上过大学&#xff0c;没留过洋&#xff0c;英文不好&#xff0c;或者数学有明显缺陷&#xff0c;但是80后、90后的知识结构和经历结构会比70后更好。 那麻烦来了&…

Harbor高可用(nginx和keepalived)

Harbor高可用&#xff08;nginx和keepalived&#xff09; 文章目录 Harbor高可用&#xff08;nginx和keepalived&#xff09;1.Harbor高可用集群部署架构1.1 主机初始化1.1.1 设置网卡名和ip地址1.1.2 设置主机名1.1.3 配置镜像源1.1.4 关闭防火墙1.1.5 禁用SELinux1.1.6 设置时…

【mybatis】TypeAliasRegistry解读

引言 在现代软件开发中&#xff0c;对象关系映射&#xff08;ORM&#xff09;框架已成为连接应用程序和数据库的桥梁&#xff0c;而MyBatis以其灵活性和简洁性&#xff0c;在众多Java ORM框架中脱颖而出。它不仅提供了丰富的映射功能&#xff0c;还允许开发者以接近SQL的方式进…