未捕获的 DOMException:无法在 'HTMLCanvasElement' 上执行 'toDataURL':可能无法导出受污染的画布
Uncaught DOMException: Failed to execute 'toDataURL' on 'HTMLCanvasElement': Tainted canvases may not be exported
看起来问题主要与我的 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':受污染的 canvases 可能无法导出。
控制台上的 FireFox 错误:操作不安全
https://jsfiddle.net/je3mL5go/1/
在 jsfiddle 中,当存在添加的行 }, {crossOrigin: 'Anonymous'});
时它起作用。
使用 s3 图像在 Heroku 上生产:
在 FireFox 中,我可以从 select 菜单 select 图像并将其添加到 canvas。我会得到提到的错误,但如果我重复单击 "Save" 按钮,在点击足够多之后(通常是 5-30 次),它将允许我将 canvas 保存为 png。
在Chrome中,这个"hack"似乎根本不起作用。
这背后有解释吗?
这似乎也是因为我在 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'});
};
select 图片上传错误
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>
果然成功了。看来我只需要等待。第二天我测试了一下,成功了!
澄清一下,上面的 header 代码可能有点矫枉过正,但这就是我目前所处的位置。我将测试 "debugging" 并删除一些允许的方法,看看哪些不需要,哪些不需要。
看起来问题主要与我的 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':受污染的 canvases 可能无法导出。
控制台上的 FireFox 错误:操作不安全
https://jsfiddle.net/je3mL5go/1/
在 jsfiddle 中,当存在添加的行 }, {crossOrigin: 'Anonymous'});
时它起作用。
使用 s3 图像在 Heroku 上生产:
在 FireFox 中,我可以从 select 菜单 select 图像并将其添加到 canvas。我会得到提到的错误,但如果我重复单击 "Save" 按钮,在点击足够多之后(通常是 5-30 次),它将允许我将 canvas 保存为 png。
在Chrome中,这个"hack"似乎根本不起作用。
这背后有解释吗?
这似乎也是因为我在 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'});
};
select 图片上传错误
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>
果然成功了。看来我只需要等待。第二天我测试了一下,成功了!
澄清一下,上面的 header 代码可能有点矫枉过正,但这就是我目前所处的位置。我将测试 "debugging" 并删除一些允许的方法,看看哪些不需要,哪些不需要。