【发布时间】:2018-06-29 05:53:31
【问题描述】:
我正在尝试在画布上显示图像。图像托管在 S3 上。
在AWS上设置了CORS,脚本中CrossOrigin属性设置为anonymous。
在 Firefox 上一切正常——但图像无法在 Chrome 和 Safari 上加载。
Safari 错误:
Origin https://www.example.com 不允许 访问控制允许来源。 http://mybucket.s3.amazonaws.com/bubble/foo.PNG
[错误] 加载资源失败:Origin https://www.example.com 不是 Access-Control-Allow-Origin 允许。 (foo.PNG,第 0 行)
跨域资源共享拒绝跨域图像加载 政策。
Chrome 错误:
通过“https://mybucket.s3.amazonaws.com/bubble/foo.PNG”访问图像 来自原点“null”已被 CORS 策略阻止:否 'Access-Control-Allow-Origin' 标头出现在请求的 资源。因此,不允许访问 Origin 'null'。
CORS 配置非常标准。我尝试了<AllowedOrigin>*</AllowedOrigin> 和其他几个变体,但没有任何区别……除了一个例外:<AllowedOrigin>null</AllowedOrigin> 似乎适用于 Chrome。
AWS 上的 CORS 配置
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>https://www.example.com</AllowedOrigin>
<AllowedOrigin>http://www.example.com</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
画布脚本
let myImage = new Image();
myImage.setAttribute('crossOrigin', 'anonymous');
myImage.src = thisDocument.url;
myImage.onload = function() {
canvas = document.getElementById('myCanvas');
context = canvas.getContext('2d');
canvas.setAttribute('width', 200);
canvas.setAttribute('height', 200);
context.fillStyle = hsl(0, 50%, 50%);
context.fillRect(0, 0, 120, 120);
context.drawImage(myImage, 12, 12, 60, 60);
};
【问题讨论】:
-
origin 'null'!=http[s]://example.com来自您允许的来源。我猜origin 'null'表示您正在以http://localhost的身份进行测试? -
不幸的是,事实并非如此。 :( 该应用程序在 Meteor 的 Galaxy (Docker/AWS) 上运行,图像托管在 S3 上。
-
解决办法是什么?请查看stackoverflow.com/questions/60024200/…
标签: google-chrome canvas amazon-s3 safari cors