0

出于所有意图和目的,假设我有一个带有输入字段的网页,用户可以在其中输入图像 URL,单击按钮,并在其 URL 的另一端获得资源的数据 URI(例如,Google 徽标)。

通过阅读,我了解到您可以像这样获取图像的数据 URI:

function imageToDataURI(src,callback)
{
    var canvas = document.createElement('canvas'),
        img    = document.createElement('img');

    img.onload = 
        function()
        {
            canvas.width  = img.width;
            canvas.height = img.height;
            canvas.getContext('2d').drawImage(img, 0, 0);
            callback(canvas.toDataURL());
        };
    img.src = src;
}

但是,很多人(包括我自己)都收到“SECURITY_ERR: DOM Exception 18”,因为画布元素在绘制跨域图像时会受到污染,并且受污染的画布会在 canvas.toDataURL() 上返回上述错误(请参阅为什么canvas.toDataURL() 抛出安全异常?)。我的问题是:我真的需要支持跨域网址!

我能做些什么?

4

1 回答 1

2

我在这里读到了一堆获取跨域数据的可用选项。几乎有3类解决方案:

  1. 那些在您的网页中造成巨大安全漏洞的人
  2. 那些不需要但需要控制跨域服务器的
  3. 那些需要您将自己的服务器变成代理的

如果你买不起 #1,不在 #2 中,并且有一个 node.js 服务器供你使用,那么这里有一个超级简单的即插即用 node.js 模块,它可以完成 #3。

/* return a datauri encoding of the resource at the given url */
exports.dataurize = 
    function(url,callback)
    {
        var request = 
            require('http').request(
                {'host':url.host || 'localhost', 
                 'port':url.port || 80, 
                 'path':url.path || '/'},
                function(resp)
                {
                    var data = '';
                    resp.setEncoding('binary');
                    resp.on('data', function(chunk) {data += chunk;});
                    resp.on('end',
                        function()
                        {
                            if( resp.statusCode == 200 )
                                callback(
                                    undefined,
                                    'data:'+resp.headers['content-type']+';base64,'+
                                       new Buffer(data,'binary').toString('base64'));
                            else
                                callback({'statusCode':resp.statusCode, 'reason':data});
                        });
                });
        request.on('error',
            function(err)
            {
                callback({'statusCode':0, 'reason':err});
            });

        request.end();
    };

将它集成到您​​的后端,您就可以免费使用#3。回到原来的问题,imageToDataURI() 现在用一个 url 查询你的 node.js 后端,你的后端用结果来响应

require('./dataurize').dataurize(...) 

即,使用所需的dataURI。

于 2012-07-20T04:17:34.820 回答