使用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; 

buffervariables将保存您需要传递给CollectionFS插入的未更改的图像数据。

在某些时候,meteor添加npmRequestOptions作为一种方式来覆盖这种情况下合理的默认值。

你现在可以简单地做

HTTP.get(url, {npmRequestOptions: {encoding: 'binary'}})

获得正确的图像数据