canvas - 如何调试 CORS 错误

我正在尝试使用跨源资源共享从 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 现在在我加载这张图片时给我错误:

Cross-origin image load denied by Cross-Origin Resource Sharing policy.

任何人都可以帮我找出问题所在,甚至可以帮我查明问题出在哪里吗?

我的图像请求 header (来自 chrome 开发工具):

要求:

 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

谢谢!

最佳答案

好的,我找到问题了。很难调试,因为浏览器没有提供太多信息。这是客户端的问题——CORS 规范对如何发出请求非常挑剔。因此,就我而言,我认为问题在于仅在图像标签中加载图像。

它似乎唯一可行的方法是在加载图像之前设置“crossOrigin”属性:

 var grabbed = new Image();
 $(grabbed).attr('crossOrigin', '');
 $(grabbed).attr("src", mySource);

我能够调试它的唯一方法是在客户端和不同配置的服务器端测试几个不同的设置,因为 header 可能很难解释。 (客户端的问题可能会让人觉得服务器配置不正确)。

https://stackoverflow.com/questions/18413763/

相关文章:

php - 使用 preg_replace 使序号全部小写

google-cloud-storage - 将大文件上传到谷歌云存储时超时

ruby-on-rails - 如何使用 nginx 作为代理将 redmine 移动到子 URI

.net - 定期 - 无法将索引 Y 处的 Unicode 字符 X 转换为指定的代码页

git - 如何搜索 git 历史(镐),但不包括重命名

shell - 查找两个文件之间有多少行不同

c# - 如何获取任何文件/文件夹的系统图标

hadoop - 以 hdfs 作为接收器的水槽中的 NoSuchMethod 错误

r - 在 R : legend and lines 中用线密度代替颜色绘制 map

ruby-on-rails - "heroku logs"给我 "Not found"