我尝试使用 Caman.js 并从 Amazon S3 加载图像。Caman.js 是一个用于生成图像效果的 JS 库,它通过将图像副本创建到画布对象并对数据进行各种像素操作来工作。看起来画布有一些安全细节来限制 javascript 在数据来自外部服务器时访问像素数据的能力,除非该服务器在请求中传递一些安全凭证,或跨域资源共享 (CORS )。
我以前从未遇到过CORS,正在尝试了解它,但我似乎无法使其正常工作。据我了解,为了避免出现在 Chrome 中的这个错误:
Unable to get image data from canvas because the canvas has been tainted by cross-origin data.
Uncaught Error: SECURITY_ERR: DOM Exception 18
您需要在您的 Amazon 存储桶上设置一个 CORS 文件。这是我正在使用的 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>
这似乎没有任何效果。这些 CORS 文件是由 Amazon 缓存的,还是我应该期望它立即生效?-- 更新:我在 8 小时后尝试了它仍然无法正常工作,所以我认为缓存不是问题。
似乎上面指定的 CORS 文件应该允许所有内容通过,不是吗?我查看了有关 CORS 和 Google 的 Chrome 文档,但似乎找不到任何好的答案。以前有人处理过这个问题吗?
谢谢!凯文
更新:这是我从对亚马逊的图像请求中获得的响应标头:
Date:Thu, 18 Oct 2012 04:52:40 GMT
ETag:"9848ce610c994521295d8aa38b47bab9"
Last-Modified:Thu, 18 Oct 2012 04:19:45 GMT
Server:AmazonS3
x-amz-id-2:Govue0tJg5MLYedr/l7T2RU5RApXLZBwJ8p507hS+sLGqxYojRnVKqj4jRHRZsZ6
x-amz-request-id:F4FF5B669C3156D2