解决阿里oss远程图片html2canvas生成海报时跨域问题(附代码)

本文涉及的产品
对象存储 OSS,标准 - 本地冗余存储 20GB 3个月
对象存储 OSS,恶意文件检测 1000次 1年
对象存储 OSS,内容安全 1000 次 1年
简介: 解决阿里oss远程图片html2canvas生成海报时跨域问题(附代码)

html2canvas生成海报的代码网上有很多,文章里不做详述,此文章主要解决阿里oss远程图片html2canvas生成海报时跨域问题

一、问题:

如果生成海报的图片存在远程图片,那么js报错如下:

Uncaught SecurityError: Failed to execute ‘toDataURL’ on ‘HTMLCanvasElement’: Tainted canvases may not be exported.

二、解决方式有两种

     ①,将图片下载以后上传到自己服务器,再从服务器读取后生成海报,此方法不是很实用,不推荐

     ②,将图片转换为base64格式后生成海报,下面详细介绍一下这种方法

三、步骤(以阿里云oss图片为例)

     ①,海报生成js代码中添加allowTaint: true

var Opts = {
  allowTaint:false,
  useCORS:true,//允许加载跨域的图片
  tainttest:true, //检测每张图片都已经加载完成
  scale:scaleBy, // 添加的scale 参数
  canvas:canvas, //自定义 canvas
  logging: false, //日志开关,发布的时候记得改成false
  width:width, //dom 原始宽度
  height:height //dom 原始高度
};

allowTaint: true 和 useCORS: true 都是解决跨域问题的方式,不同的是使用allowTaint 会对canvas造成污染,导致无法使用canvas.toDataURL 方法,所以这里不能使用allowTaint: true

     ②,在阿里云oss对应的Bucket中设置允许跨域

点击进入对应的Bucket中-基础设置-跨域设置

a4dae1a8d40fbb4b8ae6e261d3a1152.png

③,将图片转换为base64格式

网上有很多代码,这里附上我自己用的PHP代码

function master_imgUrl_base64($url){
  if($url){
    $header = array('User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:45.0) Gecko/20100101 Firefox/45.0','Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3','Accept-Encoding: gzip, deflate',);
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($curl, CURLOPT_ENCODING, 'gzip');
    curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
    $data = curl_exec($curl);
    $code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
    curl_close($curl);
  if ($code == 200) {//把URL格式的图片转成base64_encode格式的!
    $imgBase64Code = "data:image/jpeg;base64," . base64_encode($data);
    return $imgBase64Code;
  }else{
    return false;
  }
  }else{
    return false;
  }
}

调用的时候先判断是否是远程图片,如果是就转换一下:

  $preg = "/^http(s)?:\\/\\/.+/";
  if(preg_match($preg,$details_pt['pic'])){
     $detailspic =$details_pt['pic'];
  }else{
    $detailspic = master_imgUrl_base64($_W['attachurl'].$details_pt['pic']);
  }
  if(preg_match($preg,$details_pt['qr'])){
    $detailsqr =$details_pt['qr'];
  }else{
    $detailsqr =master_imgUrl_base64($_W['attachurl'].$details_pt['qr']);
  }

至此完毕,欢迎留言、

推荐两篇辅助文章:

阿里云OSS设置跨域访问 - Oops!# - 博客园   (图中的规则还是按本文中的配置)

阿里云oss访问图片出现跨域问题   (处理浏览器缓存)

相关实践学习
通义万相文本绘图与人像美化
本解决方案展示了如何利用自研的通义万相AIGC技术在Web服务中实现先进的图像生成。
目录
相关文章
|
3月前
|
编解码 数据处理 API
如何用阿里云OSS对图片和视频进行数据处理?
本文介绍了如何利用阿里云对象存储OSS进行图片和视频处理。OSS提供了丰富的功能,如图片的缩放、裁剪、旋转和水印添加等,用户只需在图片URL后附加处理参数即可实现自动化处理。同时,OSS还支持自定义样式模板,便于批量操作。对于视频处理,OSS支持转码、截图、拼接等功能,满足多终端播放需求。通过OSS的API和SDK,开发者可以方便地集成这些功能,提升数据管理效率。
|
5月前
|
存储 编解码 Serverless
Serverless架构下的OSS应用:函数计算FC自动处理图片/视频转码(演示水印添加+缩略图生成流水线)
本文介绍基于阿里云函数计算(FC)和对象存储(OSS)构建Serverless媒体处理流水线,解决传统方案资源利用率低、运维复杂、成本高等问题。通过事件驱动机制实现图片水印添加、多规格缩略图生成及视频转码优化,支持毫秒级弹性伸缩与精确计费,提升处理效率并降低成本,适用于高并发媒体处理场景。
300 0
|
3月前
|
存储 编解码 API
如何利用阿里云OSS进行图片和视频处理?
本文介绍了如何利用阿里云对象存储OSS进行图片和视频处理。内容包括OSS的基本功能、上传与管理媒体资源、图片处理(缩放、裁剪、旋转、水印等)、视频处理(转码、截图、拼接等)以及相关API的使用方法。通过OSS,用户可高效实现多媒体资源的存储与处理,适用于各类企业和开发者。
|
存储 人工智能 开发工具
AI助理化繁为简,速取代码参数——使用python SDK 处理OSS存储的图片
只需要通过向AI助理提问的方式输入您的需求,即可瞬间获得核心流程代码及参数,缩短学习路径、提升开发效率。
1721 5
AI助理化繁为简,速取代码参数——使用python SDK 处理OSS存储的图片
|
5月前
|
前端开发 JavaScript 容器
制作b超单生成器, 假怀孕b超单图片制作, p图医院证明【css+html+js装逼恶搞神器】
本资源提供一个适合用于熟人之间恶搞的工具,效果逼真,仅供学习参考与娱乐。包含前端技术学习要点:语义化布局、响应式设计、Flexbox、图片自适应
|
10月前
|
移动开发 JavaScript 前端开发
【Html.js——图片折叠效果】折叠手风琴(蓝桥杯真题-1763)【合集】
本项目实现了一个图片折叠手风琴效果,使用jQuery完成。主要包括以下部分: - **介绍**:任务是通过点击图片实现折叠和展开的效果。 - **准备**:内置初始代码,包含 `css/style.css`、`images/` 文件夹、`js/` 文件夹及 `index.html` 等文件。启动 Web Server 服务可运行项目。 - **目标**:完善 `index.js` 文件,使页面达到预期的折叠效果。 - **规定**:严格按步骤操作,保持默认文件结构不变,并在完成后保持 Web 服务正常访问状态。 - **通关代码**:使用 jQuery 实现点击事件,为选中元素添加 `act
208 19
利用html2canvas插件自定义生成名片信息并保存图片
这是一个利用html2canvas插件自定义生成名片信息并保存图片,自定义上传头像,自定义输入个人信息内容,自定义图片名称,并将生成的图片保存到本地
170 1
利用html2canvas插件自定义生成名片信息并保存图片
|
存储 人工智能 缓存
AI助理直击要害,从繁复中提炼精华——使用CDN加速访问OSS存储的图片
本案例介绍如何利用AI助理快速实现OSS存储的图片接入CDN,以加速图片访问。通过AI助理提炼关键操作步骤,避免在复杂文档中寻找解决方案。主要步骤包括开通CDN、添加加速域名、配置CNAME等。实测显示,接入CDN后图片加载时间显著缩短,验证了加速效果。此方法大幅提高了操作效率,降低了学习成本。
5876 16
|
算法 Java Linux
java制作海报四:java BufferedImage 转 InputStream 上传至OSS。png 图片合成到模板(另一个图片)上时,透明部分变成了黑色
这篇文章主要介绍了如何将Java中的BufferedImage对象转换为InputStream以上传至OSS,并解决了png图片合成时透明部分变黑的问题。
639 1
HTML图片
【10月更文挑战第4天】HTML图片。
113 2