情商:canvas.toDataURL SECURITY_ERR

IE9: canvas.toDataURL SECURITY_ERR

我正在尝试将 facebook 图片转换为 base64,但是 FileReader 在 IE9 上不工作,所以我决定使用 canvas.

无论如何,使用canvas也会产生一个问题:

SCRIPT5022: DOM Exception: SECURITY_ERR (18)

这是我的代码:

var url="http://graph.facebook.com/1420060541/picture?width=320&height=320";
 var canvas = document.createElement('CANVAS'),
 ctx = canvas.getContext('2d'),
 img = new Image;

 img.onload = function () {
  canvas.height = img.height;
  canvas.width = img.width;
  ctx.drawImage(img, 0, 0);
  var dataURL = canvas.toDataURL('image/jpg');
  console.log(dataURL);
  canvas = null;
};
img.setAttribute('crossOrigin','anonymous');
img.src = url;

更新

似乎 facebook 确实有交叉来源 header Access-Control-Allow-Origin : "*"允许任何人看到图像。 如果您尝试加载忘记添加 img.setAttribute('crossOrigin','anonymous'); 的图像,第二次添加将失败,因为缓存的图像干扰了请求 headers。清空缓存并使用 img.setAttribute('crossOrigin','anonymous'); 再次发送请求,这可能会解决您的问题。

跨域错误。没有解决办法。图片必须来自同一个域,因此您需要将图片移动到您的域(如果有的话)。或者在您的机器上设置服务器并将图像移动到该服务器上的目录。 如果您的域是 www.privateDomain.com,则只能通过 toDataURL 访问来自 privateDomain 的图像 如果您只是使用硬盘驱动器,即您的页面 url 以 file:/// 开头,则您无法通过 toDataURL 访问任何图像。

也有例外,因为某些服务器会发送 header 带有允许跨域访问的图像的文件。此类图像的来源之一是 wiki commons。还有其他的,但你必须搜索它们。

另一个解决方案是在浏览器上关闭网络安全(我不知道在 IE 上如何),但这会使您的浏览器容易受到攻击。

遗憾的是我们连图像都不能相信,但事实就是如此。