2014-09-03 2 views
4

원격 이미지를 다운로드하고 CollectionFS를 사용하여 다운로드 한 이미지를 저장하는 방법을 알아 내려고합니다.Meteor (CFS)를 사용하여 원격 이미지 다운로드

CFS에서 자동 URL 처리를 사용하려고했지만 이미지 - from-을 다운로드하는 호스트에 HEAD 요청이 비활성화되어있어 사용할 수 없습니다.

Meteor.get 또는 NPM의 'request'를 사용하려고했으나 원하는 결과를 얻기 위해 두 가지를 결합하는 방법을 이해하지 못했습니다.

모든 의견을 크게 기뻐할 것입니다. 내가하는 방법을 아는 것은 Meteor.get 요청에 URL을 사용하는 것이지만, 그 후에는 정말로 잃어버린다.

내가 지금까지 무엇을 얻을의 일종이다,하지만 난 이후 요청의 결과로 무엇을 해야할지하지 않습니다

var result = HTTP.get(url); 

이 난 단지 내가 뭔가를하기로되어있어 가정 result.body (Meteor 문서에 따라).하지만 CFS 컬렉션에 로컬로 넣을 수 있도록 해당 오브젝트를 올바르게 인코딩하는 방법을 모르겠습니다.

답변

6

서버 측 삽입물은 CollectionFS API에서 읽은 것부터 Node.js Buffer 객체를 매개 변수로 사용할 수 있습니다.

https://github.com/CollectionFS/Meteor-CollectionFS#getting-started

Buffer 객체는 nullencoding 세트 NPM request 패키지에서 얻을 것이다 무엇이며, 이것은 당신이 CollectionFS에 삽입 할 것으로 예상하고 있습니다 것입니다.

encoding에서 null으로 설정하지 않으면 원시 이진이므로 응답이 이미지 인코딩을 통과합니다.

https://github.com/meteor/meteor/blob/devel/packages/http/httpcall_server.js#L74

로 : 그것은 NPM request 주위의 래퍼 역할을하며 라인 (74)에서 볼 수 있듯이 특히 UTF-8 인코딩을 강제하기 때문에

은 불행하게도 당신은이 작업을 수행 유성 HTTP 패키지를 사용할 수 없습니다 아마도 서버 측 환경이 Fiber에 의존하기 때문에 npm 패키지는 Meteor에서 직접 사용할 수 없습니다.

/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("[email protected]"); 
    // 
    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 삽입에 전달해야하는 변경되지 않은 이미지 데이터를 보유합니다.

+0

당신은 절대적으로 놀라운을 얻기 위해 할 수 있습니다. 빠른 응답/응답을 주셔서 감사합니다. – MisutoWolf

1

어느 시점에서 Meteor는 이와 같은 경우 적절한 값을 무시하는 방법으로 npmRequestOptions을 추가했습니다.

이제 단순히

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

가 올바른 이미지 데이터

+0

감사합니다. @merlinpatt, 매우 유용한 답변입니다! – cwohlman

관련 문제