2012-05-06 10 views
3

私が直接、モンゴのGridFSに強敵からのアップロードをストリーミングしようとしています。Formidableを使ってMongoのGridFSにファイルアップロードを直接ストリームする方法はありますか?

GridStoreは、任意のデータが、それはあまりにも多くのデータが既に解析されないで、それは失敗し、店を開くのにかかる時間にしかし書くことができる前にオープンする必要があります。

にはどうすればGridStoreが着信アップロードを扱う準備することができますか?

function upload (request, response, next, options) { 
    var form = new Formidable.IncomingForm(); 

    var store = new Mongo.GridStore(options.mongoose.connection.db, new ObjectID, 'w+', { 
     root: 'store', 
     chunk_size: 1024 * 64 
    }); 

    form.onPart = function (part) { 
     if(!part.filename){ 
      form.handlePart(part); 
      return; 
     } 

     part.on('data', function(buffer){ 
      store.write(buffer); 
     }); 

     part.on('end', function() { 
      store.close(); 
     }); 
    }; 

    store.open(function (error, store) { 
     form.parse(request); 
    }); 

    response.send(); 
} 

また、ストアインスタンシエーションとオープンはおそらく何らかの形でonPart内に配置する必要があります。 GridStoreファイルを開いて以来

アレックス

答えて

3

は非同期と手ごわいではありませんが、あなたはオープンするGridStoreファイルを待っている間にストリームを着信formidablesのいくつかの手動バッファリングを行う必要があります。 GridFSはあなたにパイプすることができないので、それが開いた後に手動GridStoreにそれぞれバッファリングされたチャンクを記述する必要があります。ちょうどあなたが必要とする何をすべきgridformをリリースし

https://github.com/aheckmann/gridform

0

次の例のように、store.openコールバックの中にフォームの処理コードを移動することができ:

function upload (request, response, next, options) { 

    var store = new Mongo.GridStore(options.mongoose.connection.db, new ObjectID, 'w+', { 
     root: 'store', 
     chunk_size: 1024 * 64 
    }); 


    store.open(function (error, store) { 
     var form = new Formidable.IncomingForm(); 
     form.onPart = function (part) { 
      if(!part.filename){ 
       form.handlePart(part); 
       return; 
      } 

      part.on('data', function(buffer){ 
       store.write(buffer); 
      }); 

      part.on('end', function() { 
       store.close(); 
      }); 
     }; 
     form.parse(request); 
    }); 

    response.send(); 
} 
関連する問題