简单问题
我有一个来自Google Drive API的缩略图,我需要保存一份副本,因为它有效期到期。
上下文
我正在为管理员构建后端,以便向网站添加内容,并使用Google云端硬盘作为资源管理工具。我在Meteor上运行它,所以它是服务器端的Nodej。
尝试
使用众所周知的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域名),它失败了。
"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。
"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
而崩溃。我再次在这里停留,因为我不是流星专家,我不知道桌子下面发生了什么。必须自动添加一些标题,我必须通过任意定义内容长度搞乱某些过程,或者我不知道,地狱!
"Wow, dude, you like it hard! Why don't you just store them as files?"
首先,我更喜欢将其存储到数据库中,因为管理起来要简单得多,我相信使用dataURL最适合快速缩略图显示。其次,因为禁止访问流星公共文件夹,所以我必须手动将文件存储到服务器上的其他位置,这是丑陋的,然后提供一个允许他们检索的访问点,这是一个烂摊子。另外我尝试了mongodb的gridfs文件存储。无法使它工作,流星包装器(CollectionFS包)太麻烦了,它只是简单存储缩略图的很多基础设施。
所以,如果有人有关于3个第一点的想法,我马上给他买啤酒!我已经被困在这一个星期一个多星期了,我已经出了弹药!
谢谢=)