2012-07-22 195 views
1

我試圖建立一個快速和簡單的圖像上傳服務與節點,這需要收到的圖像,並將它們保存到Mongo的GridFS。快速響應正文到緩衝區

GridFS的獲得需要一個緩衝對象NodeJS Mongo Driver GridFS put

的問題很簡單:我怎麼投究竟/接收到的請求體轉變爲一個適當的緩衝。

到目前爲止我的代碼(只有重要的部分): api.js

var express = require('express'); 
var connect = require('connect'); 

var app = module.exports = express.createServer(); 

app.configure(function(){ 
    app.use(express.bodyParser()); 
    app.use(express.methodOverride()); 
    app.use(app.router); 
}); 

var upload = require('./upload.js'); 
app.post('/upload', upload.upload); 

upload.js

exports.upload = (function(req, res, next){ 
    console.log("Uploading image..."); 
    // Create buffer 
    // Rest of the code 
} 

我已經試過:

var buffer = new Buffer(util.inspect(req.body),'binary'); 

創建緩衝區,但它有一個錯誤的大小,可能不是正確的內容,因爲util.inspect顯然不是正確的方法走。

And: var buffer = new Buffer(req.body); 結果:

[Decode error - output not utf-8][Decode error - output not utf-8] 

緩衝區長度= 0

我很新的這兩個節點和JavaScript的總體發展,所以也許我失去了一些東西很簡單,不要猶豫,點明顯:)

謝謝!

回答

4

首先,請記住,Express是建立在Connect之上的,這是處理大量較低級HTTP工作的庫,並且它來自bodyParser()

身體解析器中間件internally使用Formidable解析文件上傳。

Formidable的默認行爲是將上傳的文件直接寫入磁盤–,換句話說,您實際上無法訪問您的路由處理程序中上傳的文件流。您可以獲得在req.body中發送的任何常規表單字段(<input> s)的值,​​並且您可以通過req.files獲取上傳的文件路徑,但是您不會收到文件內容。

簡單的回答這裏是簡單地從磁盤讀取文件,並使用它保存到Mongo中,記住完成後刪除臨時文件。當然,這將介紹將文件上載文件上傳到臨時文件夾並加載到Mongo的不必要的中間步驟。

如果您想要直接將文件數據流式傳輸到Mongo中,那麼面臨更多挑戰。您將不得不編寫自己的中間件來解析上傳流。

這實際上是相對容易。您可以從內部連接主體解析器實現—開始,使用Formidable完成重載—並使用onPartAPI將流傳遞迴您的路由處理程序,以便您可以將它傳遞給Mongo驅動程序。

+0

Express 4.0使用現在獨立的body-parser模塊,它不再具有multipart支持https://github.com/expressjs/body-parser/ – 2015-03-27 09:48:42