2012-11-22 25 views
0

我正在使用NodeJs 1.9.x以及Express 3.x,mongoose 3.3.x和gridfs-stream模塊。以下是上傳代碼。哪個工作很好。無法使用nodejs/expressjs以流的形式從MongoDB GridFS下載文件

var mongoose = require('mongoose'); 
var fs  = require('fs'); 
var GridStrm = require('gridfs-stream'); 

exports.stream_ajax_upload_file = function(req, res){ 
    var fileType = req.header('X-File-Type'); 
    var fileName = req.header('X-File-Name'); 
    var uniqId = req.param('uniqId', '112211112111'); 
    var conn  = mongoose.createConnection('localhost', 'TestArun', 27017); 
    conn.once('open', function() { 

     var gfs  = GridStrm(conn.db, mongoose.mongo); 
     var fileId = new ObjectID(uniqId); 
     writestream = gfs.createWriteStream(fileId, [{"content_type": fileType, "metadata":{ "fileName": fileName, "uploaded_at": (new Date()).toString() }}]); 

     req.on('data', function(data) { 
      console.log("Writing stream in to gridfs"); 
      writestream.write(data); 
     }); 

     req.on('end', function(data) { 
      writestream.end(); 
      res.send("I think it is uoploaded: ID::" + uniqId); 
     }); 
    }); 

} 

我能夠在網格中看到上傳的數據塊。以下是下載代碼。

var mongoose = require('mongoose'); 
var fs  = require('fs'); 
var GridStrm = require('gridfs-stream'); 

exports.download_file_as_stream = function(req, res){ 
    var uniqId = req.param('uniqId', '112211112111'); 
    var conn = mongoose.createConnection('localhost', 'TestArun', 27017); 
    conn.once('open', function() {  
     var gfs   = GridStrm(conn.db, mongoose.mongo); 
     var fileId  = new ObjectID(uniqId); 
     var readstream = gfs.createReadStream(fileId, [{"content_type": 'application/pdf'}]); 
     //res.header('content-type','application/pdf'); 
     readstream.pipe(res); 
    }); 
} 

問題是我無法下載正確的文件。當我嘗試下載時,我得到一些以請求url 的名義下載的文件,例如:download_file_as_stream。但大小與上傳的文件相同。我認爲與內容類型等問題的設置。我不確定問題在哪裏。無論是在上傳還是下載部分?

+0

嗨,你能告訴你如何處理多個文件類型控制或多個文件選擇? – codin

回答

0

要使content_type在您的writeStream中工作,您還應該通過選項mode = 'w'。默認模式是w +,但使用w + content_type不會更新。

在您的readStream中,您不需要提供content_type設置,因爲它存儲在數據庫中!