这是我的代码,用于处理向画布添加图像。这样做是创建一个Uploadify实例,它将SVG文件上传到本地[root] / uploads文件夹。然后它将图像广告到三个不同大小的画布。在任何时候都不是使用http://地址引用的图像。对图像路径的所有引用都是 local relative。
var folder = '/uploads';
var fullpath = folder + '/' + $('input#canonical').val() + ".svg";
$('#file_upload').uploadify({
'uploader': '/uploadify/uploadify.swf',
'script': '/uploadify/uploadify.php',
'cancelImg': '/uploadify/cancel.png',
'folder': folder,
'fileExt': '*.svg',
'fileDesc': 'SVG files',
'scriptData': {'rename': $('input#canonical').val() + ".svg"},
'onAllComplete': function(){
$('#upload-wrap').hide();
var img = new Image();
img.onload = function(){
var ar = img.width / img.height;
var swidth = ( ar >= 1 ) ? small : small * ar;
var mwidth = ( ar >= 1 ) ? medium : medium * ar;
var lwidth = ( ar >= 1 ) ? large : large * ar;
var sheight = ( ar <= 1 ) ? small : small / ar;
var mheight = ( ar <= 1 ) ? medium : medium / ar;
var lheight = ( ar <= 1 ) ? large : large / ar;
var sc = sCanvas.getContext('2d');
var mc = mCanvas.getContext('2d');
var lc = lCanvas.getContext('2d');
scObj.css({width:swidth, height: sheight});
mcObj.css({width:mwidth, height: mheight});
lcObj.css({width:lwidth, height: lheight});
sc.drawImage(img,0,0,swidth,sheight);
mc.drawImage(img,0,0,mwidth,mheight);
lc.drawImage(img,0,0,lwidth,lheight);
};
img.src = fullpath;
}
});
当我尝试调用canvas.toDataUrl()时,我在控制台中遇到Uncaught Error: SECURITY_ERR: DOM Exception 18
问题。有没有办法来解决这个问题?如果您需要更多信息,请与我们联系。
答案 0 :(得分:4)
在任何时候都不会使用http://地址引用图像。对图像路径的所有引用都是本地的。
那就是问题所在。您不能以这种方式使用本地文件。这里有点understanding the Canvas image security rules.
如果允许画布将本地文件绘制到自身,那么它可能会绘制本地驱动器上的文件(私有),获取其imageData,并将该文件上传到服务器,从而有效地窃取图像。我们不能这样做,因此“本地文件打破原始清洁”规则已经到位。
您实际上可以在Chrome中关闭该规则:
C:\Users\theUser\AppData\Local\Google\Chrome\Application\chrome.exe --allow-file-access-from-files
但这只应该用于调试。
答案 1 :(得分:2)
这与此处描述的问题相同:Rasterizing an in-document SVG to Canvas
基本上,将任何SVG添加到画布都会损坏画布,并且无法再在其上调用toDataURL()。显然,Firefox 12修复了这个问题,但Chrome还没有解决它。