【发布时间】:2020-02-19 17:50:40
【问题描述】:
我的问题仅在加载的图像在其他地方预加载时出现。例如,当我在某处使用带有src 属性的<img>-tag 时。
看看这段代码:
<canvas id="myCanvas" width="300" height="150" style="border:1px solid #d3d3d3;" ></canvas>
<img src="https://local-spaces.fra1.digitaloceanspaces.com/test.jpg" width="50"/>
<button onclick="show()">Load Canvas Picture</button>
<script>
function show() {
const c = document.getElementById("myCanvas");
const ctx = c.getContext("2d");
const img = new Image();
img.setAttribute('crossOrigin', 'anonymous');
img.onload = function(){
ctx.drawImage(img,0,0, 300, 150);
};
img.src = "https://local-spaces.fra1.digitaloceanspaces.com/test.jpg"
}
</script>
注意:如果您在画布中正确看到图像,请缓存+硬重新加载您的浏览器以查看错误。
如果您单击按钮并打开控制台,您会看到出现 CORS 错误:
在以下位置访问图像 'https://local-spaces.fra1.digitaloceanspaces.com/test.jpg' 来自 原点“null”已被 CORS 策略阻止:否 请求中存在“Access-Control-Allow-Origin”标头 资源。
现在让我们看下一个例子,看看它在没有预加载图像的情况下工作:https://jsfiddle.net/akzxp9vs/
注意:要使这个示例正常运行,删除缓存 + 硬重新加载浏览器非常重要。
只有这样您才能看到正确的标头响应正在回馈。
任何想法我能做什么?
图片位于名为 Spaces 的 S3 数字海洋云上。图像本身设置为公开,CORS 设置设置为:
【问题讨论】:
-
CORS 设置显然不起作用。尝试使用
curl -i https://local-spaces.fra1.digitaloceanspaces.com/test.jpg或 Postman 等。响应中没有 Access-Control-Allow-Origin 标头。 -
@sideshowbarker —
curl -H "Origin: http://example.com/" -i https://local-spaces.fra1.digitaloceanspaces.com/test.jpg -
@sideshowbarker 奇怪的是,在第二个示例中响应标头设置正确...
-
@RolandStarke 这也困扰着我!我曾经删除 crossOrigin,但是当我尝试获取图像的 blob 文件时,出现错误:
DOMException: Failed to execute 'toBlob' on 'HTMLCanvasElement': Tainted canvases may not be exported. -
Shadrix 是的,正如@Quentin 指出的那样,我测试不正确。服务器希望看到一个 Origin 标头,如果没有看到,它不会将 Access-Control-Allow-Origin 标头添加到响应中。如果请求包含 Origin 标头,则响应将具有预期的 Access-Control-Allow-Origin 标头。无论如何,请参阅@Quentin 的回答
标签: javascript amazon-s3 cors digital-ocean