2011-10-22 2 views
35

私はいくつかのファイルをアップロードし、それをS3までまっすぐに送信するアプリケーションを作成しています。私はサーバ上にtmpファイルを持っていない方がいいですからKnoxモジュールを使い、FormidableからRawストリームを取り出してKnox上でS3に送りたいと思っています。私はこのコードを使用してファイルをダウンロードするにはノックスを使用して似たような行っている:ノード形式のファイルアップロードから生のファイルストリームにアクセスする

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

今私はoposite方向(S3へのブラウザからファイルアップロード)に似た何かをしたいと思います。

これまでのところ、私はそれがアップロードされていて、ファイルからのデータの各部分をキャプチャするために、イベントハンドラを書かれている:

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メソッドをオーバーライドしています。あなたはそれを望んでいません。 knoxのダウンロードに書き込むために 'part'イベントを処理する必要があります。送信バッファを意味req.write(data)リターン偽がいっぱいの場合、ボーナスとして

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

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

その後ノックス要求を開き、生の一部のイベントを自分で処理します。これで起動します。 Formidableパーサを一時停止する必要があります。 Knoxストリームからdrainイベントを取得するときは、Formidableを再開する必要があります。

-2

データをFormidableで変換する必要があるため、ストリームをキャプチャする方法はありません。 bufferbuffer.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); 
}; 

強敵のデフォルトの動作は、ファイルへの一部を記述することです:あなたが何をしたいか

関連する問題