从图像生成数据URL

时间:2014-07-23 08:16:00

标签: meteor google-drive-api cors thumbnails data-url

简单问题

我有一个来自Google Drive API的缩略图,我需要保存一份副本,因为它有效期到期。

上下文

我正在为管理员构建后端,以便向网站添加内容,并使用Google云端硬盘作为资源管理工具。我在Meteor上运行它,所以它是服务器端的Nodej。

尝试

  1. 使用众所周知的canvas方法检索数据网址

    getImageDataURL = function (URL, cb) {
    
        var img = document.createElement("img");
        var canvas = document.createElement("canvas");
        var ctx = canvas.getContext("2d");
    
        img.setAttribute('crossorigin','anonymous');
    
        img.onload = function () {
            canvas.width = this.width;
            canvas.height = this.height;
            ctx.drawImage(img, 0, 0);
            cb && cb(canvas.toDataURL("image/jpg"));
        };
    
        img.src = URL;
    
    };
    

    但由于CORS限制(缩略图来自Google域名),它失败了。

  2. "Okay, so since it'll be stored on the server, I might as well do the job directly there."嗯,可以获得图像内容,但是由于一些未知的黑暗诅咒,我没有设法将内容转换为正确的base64格式。结果字符串几乎与预期的输出相似,但是大约有10%的不匹配字符...我尝试了大量的函数来进行base64转换,但我无法正确完成。我最终得到了这个简单的代码,我认为是正确的,有一些我在内容编码中遗漏的东西...... (这是流星代码,使用collection-hooks包)

    Medias.before.insert(function (userId, doc) {
        var res = HTTP.get(doc.thumb);
        doc.thumb = "data:"+res.headers["content-type"]+";base64,"+new Buffer(res.content, 'ascii').toString('base64');
    });
    

    我尝试使用和不使用Buffer包装器以及所有可能的Buffer编码参数,' ascii'与其他遗留转换函数相比,它产生的输出正确,例如:http://hellerim.net/base64_src.php

  3. "Proxy the god damn image then!"是的,尝试过,遇到了html标题的问题......(http-methods包)

    HTTP.methods({
        '/getImage/:url': function(){
            var req = HTTP.get(this.params.url);
    
            this.addHeader('access-control-allow-origin', '*');
            this.addHeader('content-disposition', req.headers['content-disposition']);
            this.addHeader('content-type', req.headers['content-type']);
            //this.addHeader('content-length', req.headers['content-length']);
    
            return req.content;
        }
    });
    

    如果我没有设置内容类型'我得到的数据,当然是文本。否则我一无所获。 "Right, this is because 'content-length' is missing!" ...如果我添加它,我的服务器会因可疑错误Can't render headers after they are sent to the client而崩溃。我再次在这里停留,因为我不是流星专家,我不知道桌子下面发生了什么。必须自动添加一些标题,我必须通过任意定义内容长度搞乱某些过程,或者我不知道,地狱!

  4. "Wow, dude, you like it hard! Why don't you just store them as files?"首先,我更喜欢将其存储到数据库中,因为管理起来要简单得多,我相信使用dataURL最适合快速缩略图显示。其次,因为禁止访问流星公共文件夹,所以我必须手动将文件存储到服务器上的其他位置,这是丑陋的,然后提供一个允许他们检索的访问点,这是一个烂摊子。另外我尝试了mongodb的gridfs文件存储。无法使它工作,流星包装器(CollectionFS包)太麻烦了,它只是简单存储缩略图的很多基础设施。

  5. 所以,如果有人有关于3个第一点的想法,我马上给他买啤酒!我已经被困在这一个星期一个多星期了,我已经出了弹药!

    谢谢=)

0 个答案:

没有答案