2014-09-02 76 views
2

我是mongodb的新手。如何發送來自node.js服務器的響應二進制數據

下面的代碼片段

我存儲的二進制數據:

var data = fs.readFileSync(path); 
    var image = new mongodb.Binary(data); 
    //open connection/collection 
var record = {picname: id, content: image }; 
collection.save(record, {safe: true}, function(err,result){ 
    if(err) 
    console.log(err.stack); 
    });//save 

我可以看到數據庫的記錄大小。有二進制數據。記錄大小也與文件大小相匹配。我很高興。從蒙戈並試圖響應發送

現在,檢索相同的二進制數據:

var record = {picname: id}; 
    collection.findOne(record, function(err,result){ 
    if(err) 
    console.log(err.stack); 
    else 
    { 
    console.log('before read from db for download.'); 
    //HOW TO READ IMAGE/BINARY DATA FROM RESULT? 
               //I need to send result in response. Any Idea? 
    console.log('before read from db for download'); 
    } 
    }); 

我下面的代碼片段發送二進制數據。它不適用於所有文件。可能是什麼問題:

collection.findOne(record, function(err,result){ 
       if(err) 
        console.log(err.stack); 
       else 
       { 
        console.log('before read from db for download. result: [' + result.picname + " ], type: " + result.imagetype); 
        res.end(result.content.buffer, "binary"); 
        console.log('Responded SUCCESS: ' + id); 
       } 
      });//findOne 

請讓我知道如何檢索並通過回覆發送。

在此先感謝 DD。

+0

你說「它不適用於所有文件」。它適用於哪些文件,哪些文件不適用;有沒有一種模式?另外,**如何**不是在工作?你得到一個錯誤,是文件損壞等? – 2014-09-02 16:49:09

+0

注意到gif有時不工作。 – user3297351 2014-09-02 18:34:51

+0

考慮使用GridFS,之後您可以使用以下方式編寫:'file.stream(true).pipe(res);' – vedi 2014-09-03 05:09:14

回答

0

這裏的問題不在於存儲和讀取數據,而是實際上所有關於內容類型的問題。因此,理想情況下,您希望將這些數據與您的數據一起存儲,並在發送響應時返回正確的標題信息。

所以這部分將是MIME類型檢測。有可用的模塊,mmmagic就是其中

var Magic = require('mmmagic').Magic; 

var magic = new Magic(); 

var data = fs.readFileSync(path); 
var image = new mongodb.Binary(data); 


//open connection/collection 

magic.detect(data,function(err,result) { 

    var record = {picname: id, content: image, mimeType: result }; 

    collection.save(record, {safe: true}, function(err,result){ 
     if(err) 
      console.log(err.stack); 
    });//save 

}); 

方法之一寫入頭有所不同,但基本的「http」節點調用,如下所示:

var record = {picname: id}; 
collection.findOne(record, function(err,result){ 
    if(err) 
     console.log(err.stack); 
    else { 
     res.writeHead(200, { 
      'Content-Type': result.mimeType, 
      'Content-Length': result.content.length 
     }); 
     res.write(result.content.buffer); 
     res.end(); 
    } 
}); 

那麼什麼是有效獲取返回這裏是由它正確的MIME類型標識的二進制數據。所以你可以從URL中訪問它,你可以直接在瀏覽器中查看文檔和視圖,就好像它是一個普通的圖像文件一樣。

+0

應用程序在content.length處崩潰。所以,只添加了result.mimetye。它對一些文件工作正常。不適用於所有文件。 – user3297351 2014-09-03 18:44:03

相關問題