首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Meteor下载远程图像(CFS)

使用Meteor下载远程图像(CFS)
EN

Stack Overflow用户
提问于 2014-09-03 23:06:32
回答 2查看 1.7K关注 0票数 5

因此,我正在试图找出如何下载远程映像,然后使用CollectionFS存储下载的映像。

我试图在CFS中使用自动URL处理,但是我正在下载图像的主机已经禁用了HEAD请求,所以我不能使用它。

我要么使用Meteor.get,要么使用NPM的‘请求’,但我并不真正理解如何将两者结合起来以获得所需的结果。

任何想法都将不胜感激。我只知道如何在Meteor.get请求中使用URL,但在那之后,我真的迷路了。

这是我到目前为止所取得的成果,但我不知道以后如何处理请求的结果:

代码语言:javascript
复制
var result = HTTP.get(url);

我只是假设我应该使用result.body (根据Meteor文档)做一些事情,但是我不知道如何正确地编码这个对象,以便它可以在本地被推入CFS集合中。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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行所示:

server.js#L74

您可能知道,npm包不能直接在Meteor中使用,因为服务器端环境依赖于Fiber

因此,下面是对请求的必要包装,作为一个尚未发布的包:

/packages/request/package.js :

代码语言:javascript
复制
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

代码语言:javascript
复制
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
});

然后您可以使用这样的请求:

代码语言:javascript
复制
var result=request.getSync(url,{
  encoding:null
});
var buffer=result.body;

buffer变量将保存需要传递给CollectionFS insert的未更改的图像数据。

票数 6
EN

Stack Overflow用户

发布于 2016-06-09 15:53:21

在某种程度上,Meteor添加了npmRequestOptions,作为覆盖这种情况下的合理缺省值的一种方法。

你现在可以简单地做

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

获取正确的图像数据

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25654965

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档