2011-10-22 7 views
35

일부 파일 업로드를 받아서 최대 S3까지 전송하는 응용 프로그램을 만듭니다. 내 서버에 tmp 파일을 갖고 싶지 않기 때문에 Knox 모듈을 사용하고 Formidable에서 원시 스트림을 가져 와서 Knox를 통해 S3로 보내고 싶습니다. 이 코드를 사용하여 파일을 다운로드 녹스를 사용하여 비슷한 일을했을 :node-formidable 파일 업로드에서 원시 파일 스트림에 액세스

knox.downloads.get(widget.download).on('response',function(sres){ 
    res.writeHead(200, { 
     'Content-Type':'application/zip', 
     'Content-Length': sres.headers['content-length'], 
     'Content-Disposition':'attachment; filename=' + widget.download 
    }); 
    util.pump(sres, res); 
}).end(); 

지금 내가 (S3에 브라우저에서 파일 업로드)를 oposite 방향으로 비슷한 일을하고 싶습니다. 이 업로드되는 것 같이 내가 파일에서 데이터의 각 부분을 캡처하는 이벤트 핸들러를 작성했습니다 지금까지

:

var form = new formidable.IncomingForm(); 
form.onPart = function(part){ 
    if(!part.filename){ 
     form.handlePart(part); 
    }else{ 
     if(part.name == 'download'){ 
      // Upload to download bucket 
      controller.putDownload(part); 
     }else{ 
      // Upload to the image bucket 
      controller.putImage(part); 
     } 
     //res.send(sys.inspect(part)); 
    } 
} 
form.parse(req, function(err, fields, files){ 
    if(err){ 
     res.json(err); 
    }else{ 
     res.send(sys.inspect({fields:fields, files:files}), {'content-type':'text/plain'}); 
     //controller.createWidget(res,fields,files);    
    } 
}); 


controller.putDownload = function(part){ 
    part.addListener('data', function(buffer){ 
     knox.download.putStream(data,part.filename, function(err,s3res){ 
      if(err)throwError(err); 
      else{ 
       console.log(s3res); 
      } 
     }); 
    }) 
    knox.downloads.putStream(part, part.filename, function(err,s3res){ 

     if(err)throwError(err); 
     else{ 
      console.log(s3res); 
     } 
    }); 
} 

그러나 데이터 이벤트는 나에게 버퍼를 제공합니다. 그렇다면 스트림 자체를 캡처하여 S3에 푸시 할 수 있습니까?

답변

17

은 무엇 당신이 원하는 것은 Form.onPart 메소드를 오버라이드 (override)합니다. 너는 그걸 원하지 않아. knox 다운로드에 쓰려면 'part'이벤트를 처리하고 싶습니다. 이 시작 :

form.onPart = function(part) { 
    if (!part.filename) { 
     // let formidable handle all non-file parts 
     form.handlePart(part); 
     return; 
    } 

그런 다음 녹스 요청을 열고 원시 일부 이벤트를 직접 처리 :

part.on('data', function(data) { 
    req.write(data); 
}); 
part.on('end', function() { 
    req.end(); 
}); 
part.on('error', function(err) { 
    // handle this too 
}); 

를 보너스로, 송신 버퍼를 의미 req.write(data) 반환 거짓이 가득합니다. Formidable 파서를 일시 중지해야합니다. Knox 스트림에서 drain 이벤트를 받으면 Formidable을 다시 시작해야합니다.

-2

데이터를 Formidable에서 변환해야하므로 스트림을 캡처 할 방법이 없습니다. buffer의 파일 내용은 buffer.length 청크 파일입니다. Formidable의 문서를 보면 파일이 완전히 업로드 될 때까지 파일 크기를 안정적으로보고 할 수없고 Knox의 put 메서드에서 해당 파일이 필요할 수 있으므로 문제가 될 수 있습니다. .

이 방법 전에 녹스를 사용하지 마십시오,하지만 당신은 이런 일에 약간의 행운이있을 수 있습니다 : 비트를 확인 응답에 대한

controller.putDownload = function(part){ 
    var req = knox.download.put(part.filename, { 
     'Content-Type': 'text/plain' 
    }); 
    part.addListener('data', function(buffer){ 
    req.write(buffer); 
    }); 
    req.on('response', function(res){ 
     // error checking 
    }); 
    req.end(); 
} 

약간 확실하지만 .... 당신이에 있음을 채찍질 할 수 있는지 모양. 또한 Streaming an octet stream from request to S3 with knox on node.js에는 유용한 정보가 있습니다.

IncomingForm.prototype.onPart = function(part) { 
    // this method can be overwritten by the user 
    this.handlePart(part); 
}; 

가공 할의 기본 동작은 파일의 일부를 작성하는 것입니다 :

관련 문제