Node.js 使用Meteor(CFS)下载远程图像
因此,我试图弄清楚如何下载远程映像,然后使用CollectionFS存储下载的映像 我试图在CFS中使用自动URL处理,但我下载图像的主机已禁用HEAD请求,因此我无法使用它 我不是打算使用Meteor.get,就是NPM的“请求”,但我真的不明白如何将两者结合起来以获得所需的结果 如有任何想法,将不胜感激。我只知道如何在Meteor.get请求中使用URL,但在那之后,我真的迷路了 这是我目前得到的结果,但我不知道以后如何处理请求的结果:Node.js 使用Meteor(CFS)下载远程图像,node.js,http,encoding,meteor,Node.js,Http,Encoding,Meteor,因此,我试图弄清楚如何下载远程映像,然后使用CollectionFS存储下载的映像 我试图在CFS中使用自动URL处理,但我下载图像的主机已禁用HEAD请求,因此我无法使用它 我不是打算使用Meteor.get,就是NPM的“请求”,但我真的不明白如何将两者结合起来以获得所需的结果 如有任何想法,将不胜感激。我只知道如何在Meteor.get请求中使用URL,但在那之后,我真的迷路了 这是我目前得到的结果,但我不知道以后如何处理请求的结果: var result = HTTP.get(url);
var result = HTTP.get(url);
我只假设我应该对result.body做些什么(根据Meteor文档),但我不知道如何正确编码该对象,以便将其推入本地CFS集合。根据我在CollectionFS API上读到的内容,服务器端插入可以将Node.js
Buffer
对象作为参数
缓冲区
对象是您将从npm请求
包中获得的对象,其编码
设置为空
,这是您希望插入到CollectionFS中的内容
如果我们不将encoding
设置为null
,响应将通过字符串编码,这将破坏图像数据,因为这是原始二进制文件
不幸的是,您不能使用Meteor HTTP包来实现这一点,因为它充当npm请求的包装器,特别是强制编码为utf-8,如第74行所示:
您可能知道,npm包不能直接在Meteor中使用,因为服务器端环境依赖于Fiber
s
因此,以下是对请求的必要包装,作为一个尚未发布的包:
/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
变量将保存您需要传递给CollectionFS insert的未更改图像数据。在某个点Meteor添加了npmRequestOptions
,以覆盖此类情况下的合理默认值
你现在可以简单地做
HTTP.get(url,{npmRequestOptions:{encoding:'binary'}})
要获得正确的图像数据你真是太棒了。我会尽快测试并回复你,谢谢你的快速回复/回答。谢谢@merlinpatt,非常有用的回答!