2013-12-10 114 views
0

我試圖使用GridFS將圖像保存到MondoDB集合。爲了驗證這一點,我做了以下內容:MongoDB GridFS圖像加載不正確

<!DOCTYPE html> 
<html> 
<head> 
    <meta charset="utf-8"> 
</head> 
<body> 

<?php 
// open connection 
$m = new MongoClient(); 
$db = $m->selectDB('ImageDatabase'); 
$gridUploads = $db->getGridFS('images'); 

// save image 
$fileName = 'C:\Users\Thomas\Pictures\commits.png'; 
$gridUploads->storeFile($fileName); 

// load image 
$doc = $gridUploads->findOne($fileName); 

// dsplay image 
header('Content-type: image/png'); 
echo $doc->getBytes(); 

?> 


</body> 
</html> 

這應該將圖像上傳到集合,然後獲得從集合相同的圖像,並顯示它。

在此之後收集的內容是:

{ 
    "_id" : ObjectId("52a6fcdd1dc38f0c3c0016bf"), 
    "filename" : "C:\\Users\\Thomas\\Pictures\\commits.png", 
    "uploadDate" : ISODate("2013-12-10T11:37:01.000Z"), 
    "length" : 179952, 
    "chunkSize" : 262144, 
    "md5" : "768d618923442668ca2a60f02be59d52" 
} 

的print_r($ DOC):

MongoGridFSFile Object 
(
    [file] =&gt; Array 
     (
      [_id] =&gt; MongoId Object 
       (
        [$id] =&gt; 52a6fcdd1dc38f0c3c0016bf 
       ) 

      [filename] =&gt; C:\Users\Thomas\Pictures\commits.png 
      [uploadDate] =&gt; MongoDate Object 
       (
        [sec] =&gt; 1386675421 
        [usec] =&gt; 0 
       ) 

      [length] =&gt; 179952 
      [chunkSize] =&gt; 262144 
      [md5] =&gt; 768d618923442668ca2a60f02be59d52 
     ) 

    [gridfs:protected] =&gt; MongoGridFS Object 
     (
      [w] =&gt; 1 
      [wtimeout] =&gt; 10000 
      [chunks] =&gt; MongoCollection Object 
       (
        [w] =&gt; 1 
        [wtimeout] =&gt; 10000 
       ) 

      [filesName:protected] =&gt; images.files 
      [chunksName:protected] =&gt; images.chunks 
     ) 

    [flags] =&gt; 0 
) 

然而結果的主體內容是:

<img style="-webkit-user-select: none" src="http://localhost/path-to/the-script.php"> 

任何ideads爲什麼?

謝謝!

+0

結果內容是圖片標籤? – Sammaye

+0

是的,我不知道應該發生什麼,但我想一個img標籤,其中src屬性是php文件的路徑不是它^^ – tpei

+0

我真的不知道這是怎麼可能的... – Sammaye

回答

0

根據您的第一個代碼示例(混合HTML和PHP),您將在HTML本身內回顯圖像的字節。在發送響應主體之後還有一個叫header()的問題(header() PHP docs中討論的第一件事情之一)。我假設你的意思是要有一個<img>標記,其src屬性指向一個單獨的PHP腳本,它只需設置Content-type標題並返回圖像字節。

如果你確實意味着輸出的頁面響應中圖像的字節數,你應該考慮使用數據URI:

然而,指着src屬性一個PHP腳本可能是更好的選擇(特別是對於大圖像)。我無法解釋您的原始腳本如何生成:

<img style="-webkit-user-select: none" src="http://localhost/path-to/the-script.php"> 

...但這當然是你應該在這裏瞄準。

關於使用MongoGridFSFile::getBytes(),您應該注意getResource()會更有效率,特別是對於大圖像。使用資源可以減少內存消耗,因爲一次只能在內存中加載兩個塊(來自GridFS)。使用getResource()輸出文件內容的簡明示例可以在here找到。