【发布时间】:2017-07-04 22:20:45
【问题描述】:
我知道以前有人问过类似的问题,但我仍然无法解决。我有一个div,其中的图像是从 AWS s3 的存储桶中加载的,它们加载完全没问题。
现在我希望能够将特定 div 中的任何内容保存为 jpeg(比如截屏),插件 html2canvas 可以帮助解决这个问题。问题是,当我尝试实际保存它(或简单地立即显示此类屏幕截图的结果)时,我遇到了这些问题:
画布被污染 => 我在插件中设置了
allowTaint: true,但它会抛出这个错误,所以我禁用它并且错误消失了。我将useCORS设置为true以允许来自其他来源的图像。CORS 政策已阻止访问图像
为了解决这个问题,我在我的 AWS S3 存储桶上设置了 CORS,但这似乎不起作用(或部分起作用)。我注意到,当插件使用它们生成 jpeg 时,这些图像的响应标头没有 CORS 元数据。然后我尝试在div 内的这些图像中设置crossOrigin="anonymous",但它会立即引发CORS 错误,这不应该发生,因为AWS 存储桶已为此设置如下:
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<AllowedHeader>Authorization</AllowedHeader>
</CORSRule>
</CORSConfiguration>
关于如何完成这项工作,我已经没有办法了。任何关于如何从这里开始的想法都将非常感激。
编辑:更多详细信息,我正在使用 React,并且图像 url 是从服务器检索的。这意味着,一旦我得到这个 url 数组,我就会生成:
<div>
{ urls.map(url => <img src={url} alt="some alt" />) }
</div>
如果我添加 crossOrigin="anonymous" 我会收到 CORS 错误。如果我忽略它,图像会显示,但html2canvas 插件在尝试生成“屏幕截图”时也会引发 CORS 错误。
有关 HTTP 请求的更多详细信息。所以我第一次在div 中加载图像时,这是响应标头:
Accept-Ranges:bytes
Access-Control-Allow-Methods:GET
Access-Control-Allow-Origin:*
Cache-Control:max-age=2592000
Content-Length:508208
Content-Type:image/png
Date:Thu, 16 Feb 2017 18:25:05 GMT
Last-Modified:Wed, 15 Feb 2017 19:09:44 GMT
Server:AmazonS3
Vary:Origin, Access-Control-Request-Headers, Access-Control-Request-Method
现在,如果crossOrigin='anonymous' 并且图片不是来自缓存,则此方法有效。如果未设置 crossOrigin 属性,我会得到:
Accept-Ranges:bytes
Cache-Control:max-age=2592000
Content-Length:508208
Content-Type:image/png
Date:Thu, 16 Feb 2017 19:03:53 GMT
Last-Modified:Wed, 15 Feb 2017 19:09:44 GMT
Server:AmazonS3
或者它会在控制台上引发 CORS 错误,而不会在响应标头上显示任何元数据。我尝试在 url (?somethingsomething) 的末尾添加一个随机字符串,这样它们就永远不会从缓存中被抓取,这完全解决了这个问题。但这只是一个 hack,它现在可以工作,但它绝对不是我正在寻找的解决方案。我认为 Chrome 正在对缓存做一些事情,我很难跟踪问题的根源,除了在我的机器上很难重现这个问题,因为即使我完全使用它,它总是从缓存中检索屏幕截图新图像和禁用/清除缓存。这很混乱。
【问题讨论】:
-
Access to image has been blocked by CORS policy- 显示您用于获取图像的代码 -
您必须直接在文档中加载带有
crossOrigin属性设置为'anonymous'的图像,或者您可以尝试useCORSh2c 选项。allowTaint选项只是说你不在乎它是否会污染画布。 -
查看编辑,我确实尝试设置 crossOrigin 属性,但没有成功,我使用
useCORS设置为true(忘了说抱歉)。还是没有运气。 -
啊,你的存储桶设置有问题。已经有一段时间了,但你的 conf 对我来说似乎没问题,也许删除
Allowed header字段,我认为没有必要。可以查this answer,挺老的,我也没有s3账号可以测试了…… -
您能否捕获并显示失败请求的完整请求和响应标头以及整个 CORS 错误?
标签: javascript canvas amazon-s3