当前位置: 首页 > 知识库问答 >
问题:

无法导出受污染的画布

闻法
2023-03-14

遵循CORS上的线程缓存效果:请求的资源上不存在“Access Control Allow Origin”头

我已经能够用我的html画布解决一个奇怪的CORS问题。正如上面的线程中所述,当通过下面的函数添加图像时,我收到了标准的浏览器CORS违规警告,但根据是否清除浏览器缓存,我无法真正重现原因。当删除CrossOrigin:'匿名'属性时,我完全能够通过此函数从S3向画布添加图像:

fabric.Image.fromURL url, ((img) ->
    # scale template image
    img.scale 0.5
    img.name = 'template_img'
    # add image to canvas
    canvas.add img
    # send to back
    canvas.sendToBack img
    # make not selectable since its the background image
    img.selectable = false
    return
  )

现在我的应用程序想通过导出画布

dataURL = canvas.toDataURL(
        format: 'png'
        quality: 0.8)

但是,由于现在缺少“匿名”属性,浏览器正在阻止此操作:

DOMException:无法在“HTMLCanvasElement”上执行“toDataURL”:可能无法导出受污染的画布。

事实上,我现在处于一个循环中:

  1. 添加crossOrigin属性会导致在画布上添加图像失败
  2. 删除crossOrigin属性会使我在画布上添加图像,但不允许将其导出

我已经尝试了一切来使这个工作,也在玩CORS规则,但是除了标准通配符和域设置之外,我无能为力。

我在AWS S3上的CORS规则集:

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
    <AllowedOrigin>*</AllowedOrigin>
    <AllowedMethod>PUT</AllowedMethod>
    <AllowedMethod>POST</AllowedMethod>
    <AllowedMethod>GET</AllowedMethod>
    <AllowedMethod>HEAD</AllowedMethod>
    <MaxAgeSeconds>3000</MaxAgeSeconds>
    <AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>

我该怎么做才能将图像添加到画布中,然后再将其导出?

共有1个答案

宗沛
2023-03-14

对于任何在这个问题上绊倒的人。我做了更多的研究,发现这确实是Chrome的一个常见问题,因为Safari似乎工作正常。当在画布上添加URL后面添加时间戳时,我阻止浏览器每次都缓存它。这解决了CrossOrigin问题,让我可以正确添加属性。

修改代码:

url = url + "?" + Math.random()
fabric.Image.fromURL url, ((img) ->
  # scale template image
  img.scale 0.5
  img.name = 'template_img'
  # add image to canvas
  canvas.add img
  # send to back
  canvas.sendToBack img
  # make not selectable since its the background image
  img.selectable = false
  return
), crossOrigin: 'anonymous'
 类似资料:
  • 问题内容: 我想将画布保存为img。我有这个功能: 它给我错误: 未捕获到的SecurityError:无法在“ HTMLCanvasElement”上执行“ toDataURL”:可能无法导出污染的画布。 我该怎么办? 问题答案: 出于安全原因,您的本地驱动器被声明为“其他域”,并将污染画布。 (这是因为您最敏感的信息可能在本地驱动器上!)。 在测试时,请尝试以下解决方法: 将所有与页面相关的文

  • 我受到了某种测试污染。当我单独运行失败测试时,它们会通过。当我把它们一起运行时,我会得到错误。这些错误与数据库无关。我不能理解错误。例如:页面: 我不明白,因为模块的内容不是必需的。另外,另一个测试的污染会导致这种情况吗?我的测试太多了,无法列出。 我唯一的想法是cookie被设置而不是由我的程序。有一堆cookie,它们具有奇怪的名称,如“ba743b”、“kvcd”、“kn_ai”等,并具有神

  • 描述 HTTP 参数污染,或者 HPP,在网站接受用户输入,将其用于生成发往其它系统的 HTTP 请求,并且不校验用户输出的时候发生。它以两种方式产生,通过服务器(后端)或者通过客户端。 在 StackExchange 上,SilverlightFox 提供了一个 HPP 服务端攻击的不错的例子。假设我们拥有以下站点:https://www.example.com/transferMoney.ph

  • 问题内容: 我知道在Java 7中使用带有泛型类型的varargs时会发生这种情况。 但是我的问题是.. Eclipse说“使用它可能会污染堆”时,这到底是什么意思? 和 新注释如何防止这种情况? 问题答案: 堆污染是一个技术术语。它引用的引用类型不是其指向的对象的超类型。 这可能会导致“无法解释” 。 @SafeVarargs完全不能阻止这一点。但是,有些方法证明不会污染堆,编译器无法证明这一点

  • 烟花由中国古代人民较早发明,常用于盛大的典礼或表演中,也在除夕夜及元宵节中燃放用来烘托节日氛围。近年来随着环境污染的加剧,一些地区已经禁止燃放烟花了,那我们就用 Python 实现一场无污染的烟花秀。

  • 本文向大家介绍如何修复HTML中的getImageData()错误“画布已被跨源数据污染”?,包括了如何修复HTML中的getImageData()错误“画布已被跨源数据污染”?的使用技巧和注意事项,需要的朋友参考一下 crossOrigin 属性允许在像他们被从当前原点加载的一个画布中使用的是自外部来源加载的图像。 使用未经CORS批准的图像会污染画布。画布污染后,您将无法再将数据拉出画布。通过