gpt4 book ai didi

javascript - 未捕获的 DOMException : Failed to execute 'toDataURL' on 'HTMLCanvasElement' : Tainted canvases may not be exported

转载 作者:行者123 更新时间:2023-11-28 03:27:07 27 4
gpt4 key购买 nike

看起来这个问题主要与我的 aws s3 存储桶 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>
<AllowedMethod>PUT</AllowedMethod>
<AllowedMethod>POST</AllowedMethod>
<AllowedMethod>DELETE</AllowedMethod>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>HEAD</AllowedMethod>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>

到我的存储桶 CORS 配置,但这也没有帮助。由于某种原因,我能够将照片添加到 Canvas 上(取决于代码),但无法使用来自 AWS 的图像保存 Canvas

<小时/>

我有一个 Fabric.js Canvas ,它被来自亚马逊 s3 的图像污染了。我不确定到底发生了什么。

当我尝试通过单击“保存”来保存 Canvas 时:

控制台上的 Chrome 错误:未捕获 DOMException:无法在“HTMLCanvasElement”上执行“toDataURL”:受污染的 Canvas 可能无法导出。

控制台上的 FireFox 错误:操作不安全

https://jsfiddle.net/je3mL5go/1/

在 jsfiddle 中,当添加行 }, {crossOrigin: 'Anonymous'}); 时它会起作用。存在。

在 Heroku 上使用 s3 图像进行生产:

在 FireFox 中,我可以从选择菜单中选择图像并将其添加到 Canvas 中。我会收到如上所述的错误,但如果我重复单击“保存”按钮,经过足够的点击(通常是 5-30 次)后,它将允许我将 Canvas 另存为 png。

在 Chrome 中,这种“黑客”似乎根本不起作用。

这背后有解释吗?

似乎因为我在 AWS S3 中托管图像,所以这也会对其产生影响。但即使如此,上面的示例(在 FireFox 中重复单击)仍然有效。

尝试:

与:

function updateTshirtImage(imageURL){
fabric.Image.fromURL(imageURL, function(img) {
img.scaleToHeight(300);
img.scaleToWidth(300);
img.crossOrigin = 'anonymous';
canvas.centerObject(img);
canvas.add(img);
canvas.renderAll();
});
};

我可以上传图像,但是当我单击“保存”时:

我遇到了与上面相同的错误。

当我使用时:

function updateTshirtImage(imageURL){
fabric.Image.fromURL(imageURL, function(img) {
img.scaleToHeight(300);
img.scaleToWidth(300);
canvas.centerObject(img);
canvas.add(img);
canvas.renderAll();
}, {crossOrigin: 'anonymous'});
};

选择图片上传时出错

No 'Access-Control-Origin-Header' is present...

尝试:

function updateTshirtImage(imageURL){
var rand = '?'+Math.random();
var no_cors = new Image();
no_cors.onload = loadCORS;
no_cors.src = imageURL + rand;

function loadCORS(){
var with_cors = new Image();
with_cors.crossOrigin = 'anonymous';
with_cors.src = no_cors.src;
with_cors.onload = function(){console.log('loaded');};
with_cors.onerror = function(){console.error('failed');};
fabric.Image.fromURL(with_cors.src, function(img) {
img.scaleToHeight(300);
img.scaleToWidth(300);
canvas.centerObject(img);
canvas.add(img);
canvas.renderAll();
}, {crossOrigin: 'anonymous'});
}
};

var images = <%= images_2.to_h.to_json.html_safe %>
document.getElementById("tshirt-design").addEventListener("change", function(){
updateTshirtImage(images[this.value]);
}, false);

错误:

Chrome:404 错误

Firefox:没有错误,不工作。

这里的问题是我在向 aws 请求之前以某种方式更改了 aws s3 的 url 吗?

最佳答案

添加:

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>https://www.example.com</AllowedOrigin>
<AllowedMethod>PUT</AllowedMethod>
<AllowedMethod>POST</AllowedMethod>
<AllowedMethod>DELETE</AllowedMethod>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>HEAD</AllowedMethod>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>

确实达到了目的。看来我只需要等待。第二天我测试了一下,成功了!

澄清一下,上面的头代码可能有点过分了,但这就是我目前所处的位置。我将测试和“调试”并删除一些允许的方法,看看哪些方法是不需要的。

关于javascript - 未捕获的 DOMException : Failed to execute 'toDataURL' on 'HTMLCanvasElement' : Tainted canvases may not be exported,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58534506/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com