2014-02-27 3 views
0

REQUEST (https://www.npmjs.org/package/request)를 사용하여 filepicker를 통해 파일을 보내고있는 중 일부를 파악하지 못했습니다. 나는 위해 RESTClient를 통해 루비에서이 백을했고, 그것은 다음과 같습니다NodeJS : Request POST를 통해 파일을 보내는 방법

response = RestClient.post "https://www.filepicker.io/api/store/S3?key=#{@api_key}", 
    { fileUpload: File.new(zip_path), mimetype: 'application/zip', 
    filename: "filename.zip", multipart:true, access: 'public'} 

I (1)가 형성되는 요청의 매개 변수의 대응이 (무엇을 몸 헤더,이 두 가지 질문이???)? (2) 노드 파일 시스템의 파일을 요청 (예 : File.new)에 전송할 수있는 방법은 무엇입니까?

+0

동일한 질문이 여기에 있습니다. http://stackoverflow.com/questions/17218506/file-upload-to-a-node-js-server –

+0

흠 나는 그것이 다를 수도 있다고 생각합니다. 내 자신의 서버에 파일을 업로드하려하지 않고 파일이있는 다른 서버에 요청을 보내려고합니다. –

+0

restler 또는 node-rest-client를 시도 했습니까? 루비 restclient와 비슷합니다. –

답변

1

나는 이것도 밖으로 분류하는 공정한 비트가 있었다. 아마도 나는 뭔가를 놓쳤을 지 모르지만 일하는 것이 비정상적으로 복잡해 보였습니다. 그것은 form-data 모듈을 직접 사용하는 것과 관련이 있습니다 (흥미롭게도 요청은 의존적입니다).

문제의 근본 원인은 파일 데이터가 모두 들어있는 양식이 호출하기 전에 업로드 요청에 사용할 수 있는지 확인하는 경쟁 조건이었습니다. 드디어 the advice one user offered in the issue comments; 먼저 요청 모듈에서 자동으로 만든 버전을 사용하지 않고 양식을 작성한 다음 해당 양식을 대신 사용하도록 요청 개체를 업데이트했습니다.

내가 마지막으로 사용한 솔루션의 슬림화 된 버전은 다음과 같습니다.

var FormData = require('form-data'); 
var request = require('request'); 

function upload(filepath, url, cb) { //cb(error) 

    // Create the form with your file's data appended FIRST 
    var form = new FormData(); 
    form.append('file', fs.createReadStream(filepath)); 

    // Needed to set the Content-Length header value 
    form.getLength(function(err,length) { 

     var opts = { 
      headers: { 
       'Content-Length': length 
      } 
     }; 

     // Create the request object 
     var r = request.post(url, opts, function(error, res, body) { 

      /* 

      Do things... 

      */ 

      cb(error); 
     }); 

     // Explicitly set the request's form property to 
     // the form you've just created (not officially supported) 
     r._form = form; 
    }); 
} 
+0

나는이 해결책도 같이 갔다. 고맙습니다! –

관련 문제