Node.js 使用Meteor(CFS)下载远程图像

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);

因此,我试图弄清楚如何下载远程映像,然后使用CollectionFS存储下载的映像

我试图在CFS中使用自动URL处理,但我下载图像的主机已禁用HEAD请求,因此我无法使用它

我不是打算使用Meteor.get,就是NPM的“请求”,但我真的不明白如何将两者结合起来以获得所需的结果

如有任何想法,将不胜感激。我只知道如何在Meteor.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,非常有用的回答!