因此,我正在试图找出如何下载远程映像,然后使用CollectionFS存储下载的映像。
我试图在CFS中使用自动URL处理,但是我正在下载图像的主机已经禁用了HEAD请求,所以我不能使用它。
我要么使用Meteor.get,要么使用NPM的‘请求’,但我并不真正理解如何将两者结合起来以获得所需的结果。
任何想法都将不胜感激。我只知道如何在Meteor.get请求中使用URL,但在那之后,我真的迷路了。
这是我到目前为止所取得的成果,但我不知道以后如何处理请求的结果:
var result = HTTP.get(url);我只是假设我应该使用result.body (根据Meteor文档)做一些事情,但是我不知道如何正确地编码这个对象,以便它可以在本地被推入CFS集合中。
发布于 2014-09-03 23:53:17
根据我在CollectionFS API上所读到的内容,服务器端插入可以将Node.js Buffer对象作为参数。
https://github.com/CollectionFS/Meteor-CollectionFS#getting-started
Buffer对象是从encoding设置为null的npm request包中获得的,这就是您需要插入到CollectionFS中的内容。
如果我们不将encoding设置为null,响应将通过字符串编码来破坏图像数据,因为这是原始二进制文件。
不幸的是,您不能使用Meteor包来实现这一点,因为它充当npm request的包装器,并特别强制编码为utf-8,如第74行所示:
您可能知道,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变量将保存需要传递给CollectionFS insert的未更改的图像数据。
发布于 2016-06-09 15:53:21
在某种程度上,Meteor添加了npmRequestOptions,作为覆盖这种情况下的合理缺省值的一种方法。
你现在可以简单地做
HTTP.get(url, {npmRequestOptions: {encoding: 'binary'}})
获取正确的图像数据
https://stackoverflow.com/questions/25654965
复制相似问题