使用Meteor(CFS)下载远程图像
所以,我试图找出如何下载远程图像,然后使用CollectionFS存储下载的图像。
我试图在CFS中使用自动URL处理,但是我正在下载图像的主机已禁用HEAD请求,所以我无法使用它。
我要么使用Meteor.get,要么使用NPM的“请求”,但是我不太了解如何将这两者结合起来以获得所需的结果。
任何想法将不胜感激。 我所知道的只是在Meteor.get请求中使用这个URL,但在那之后,我真的迷失了方向。
这是我到目前为止所得到的,但是我不知道如何处理请求的结果:
var result = HTTP.get(url);
我只假设我应该用result.body(按照Meteor文档)做某件事情,但是我不知道如何正确编码这个对象,以便它可以被推送到本地的CFS集合中。
从我读过的CollectionFS API中,服务器端插入可以将一个Node.js Buffer
对象作为参数。
https://github.com/CollectionFS/Meteor-CollectionFS#getting-started
一个Buffer
对象是你将从npm request
包得到的, encoding
设置为null
,这就是你想要插入到CollectionFS中的东西。
如果我们不将encoding
设置为null
,则响应将通过string编码传递,这将破坏我们的图像数据,因为这是原始二进制文件。
不幸的是,你不能使用meteorHTTP包来做到这一点,因为它充当npm request
的包装,特别强制编码为utf-8,如第74行所示:
https://github.com/meteor/meteor/blob/devel/packages/http/httpcall_server.js#L74
正如您可能知道的那样,npm包不能直接用在Meteor中,因为服务器端环境依赖于Fiber
。
所以这里是必要的包装要求,作为一个尚未发布的软件包:
/packages/request/package.js :
Package.describe({ summary:"Simplified HTTP request client", version:"2.40.0" }); Npm.depends({ "fibers":"1.0.1", "request":"2.40.0" }); Package.onUse(function(api){ // api.versionsFrom("METEOR@0.9.0.1"); // api.use("underscore","server"); // api.addFiles("server/lib/request.js","server"); // api.export("request","server"); });
/packages/request/server/lib/request.js
:
var Future=Npm.require("fibers/future"); request=Npm.require("request"); var requestSync=function(uri,options){ var future=new Future(); request(uri,options,function(error,response,body){ if(error){ console.log(error); throw error; } future.return({ response:response, body:body }); }); return future.wait(); }; _.extend(request,{ putSync:function(uri,options){ options.method="PUT"; return requestSync(uri,options); }, patchSync:function(uri,options){ options.method="PATCH"; return requestSync(uri,options); }, postSync:function(uri,options){ options.method="POST"; return requestSync(uri,options); }, headSync:function(uri,options){ options.method="HEAD"; return requestSync(uri,options); }, delSync:function(uri,options){ options.method="DELETE"; return requestSync(uri,options); }, getSync:requestSync });
那么你可以使用这样的请求:
var result=request.getSync(url,{ encoding:null }); var buffer=result.body;
buffer
variables将保存您需要传递给CollectionFS插入的未更改的图像数据。
在某些时候,meteor添加npmRequestOptions
作为一种方式来覆盖这种情况下合理的默认值。
你现在可以简单地做
HTTP.get(url, {npmRequestOptions: {encoding: 'binary'}})
获得正确的图像数据