2012-05-06 138 views
3

我想從Formidable直接上傳到Mongo的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中。

亞歷

回答

3

由於打開Gridstore的文件是異步而艱鉅的不是,你需要做的強敵的一些手動緩衝輸入流在等待Gridstore的文件打開。由於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(); 
} 
相關問題