我正在尝试使用跨源资源共享从Amazon S3获取图像,以便我可以使用canvas.toDataUrl()方法。
在S3上,我将存储桶上的CORS配置设置为:
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>POST</AllowedMethod>
<AllowedMethod>PUT</AllowedMethod>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
当canvas.toDataURL()抛出安全错误代码18时,我猜测是因为图像必须加载“crossOrigin”属性集。
但是,无论我如何从S3加载图像,例如:
<img src="http://s3.amazonaws.com/storybookstorage/wood.png" crossOrigin="anonymous">
当我加载此图片时,Chrome现在会出现错误:
跨源资源共享策略拒绝跨源图像加载。
任何人都可以帮我弄清楚什么是错的,甚至可以找出问题所在的位置吗?
我的图片请求标题(来自chrome dev工具):
请求:
GET /storybookstorage/wood.png HTTP/1.1
Host: s3.amazonaws.com
Connection: keep-alive
Cache-Control: max-age=0
Accept: image/webp,*/*;q=0.8
If-None-Match: "d5098b2c3d1417da8ccd9764612248ca"
If-Modified-Since: Thu, 08 Aug 2013 01:10:23 GMT
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.57 Safari/537.36
DNT: 1
Referer: http://0.0.0.0:3000/items/1/
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
响应:
Date:Sat, 24 Aug 2013 00:27:56 GMT
ETag:"d5098b2c3d1417da8ccd9764612248ca"
Last-Modified:Thu, 08 Aug 2013 01:10:23 GMT
Server:AmazonS3
x-amz-id-2:gyR2VMt9hec8HrGvcXvDrrRb/sOm3i/WpUaRdnpr/PY2VoaJigSdA960B0q83zzN
x-amz-request-id:434E3571705359E9
谢谢!
答案 0 :(得分:2)
好的,我发现了问题。它很难调试,因为浏览器没有提供太多信息。这是客户端的一个问题 - CORS规范对于如何发出请求非常挑剔。所以在我的情况下,我认为问题是只是在图像标签中加载图像。
它似乎唯一可行的方法是在加载图像之前设置“crossOrigin”属性:
var grabbed = new Image();
$(grabbed).attr('crossOrigin', '');
$(grabbed).attr("src", mySource);
我能够调试的唯一方法是在客户端测试几种不同的设置&amp;不同的配置服务器端,因为标头很难解释。 (客户端问题可能使服务器配置不正确。)