2012-10-30 103 views
0

我正在嘗試編寫一個函數來處理mySQL/PHP中的圖像,但無法計算出如何存儲結果。我已經包含了一個精簡版的代碼來演示這個問題。如何將圖像作爲Blob存儲在數據庫中?

image.image_o中的斑點都被正確存儲並可用於將圖像輸出到網頁。該函數運行沒有錯誤,但之後在image.image_r blob只是幾個字節長,幷包含文本,如「資源ID#5」

我相信我做的事愚蠢 - 只是不能看到它是什麼。

function process_images(){ 
    global $mysql 
    $sql = "select id, image_o from image"; 
    $res = mysqli_query($mysqli, $sql); 
    if ($res){ 
     while ($ay = mysqli_fetch_array($res, MYSQLI_ASSOC)){ 
      $id = $ay['id']; 
      $im = imagecreatefromstring($ay['image_o']); 
      // do something useful with the image 
      $sql2 = "update image set image_r = '{$im}' where id = $id"; 
      $res2 = mysqli_query($mysqli, $sql2); 
      if ($res2){ 
       // blah blah 
      }else{ 
       echo mysqli_error($mysqli)." in res2"; 
      } 
     } 
    }else{ 
     echo mysqli_error($mysqli)." in res"; 
    } 
} 
+5

您知道將圖像存儲在數據庫中是不明智的嗎?你爲了...而犧牲了性能... ... – Layke

+0

數據庫是不正確的圖像的地方。將圖像存儲在常規文件系統中,並在DB中保留引用(文件名+路徑等) –

+0

我通常會同意上述內容。只是爲了扮演Devil的倡導者,如果你有多個應用程序服務器和一個數據庫,你可能希望將文件存儲在數據庫中,但由於託管限制或其他限制,沒有一個好方法來建立共享文件系統。這當然不是理想的,但那不是重點。 –

回答

0

我同意上面的評論,這通常是不可取的。不過,這裏有一篇關於你爲什麼可以這樣做的偉大文章,以及如何。它還強調了在數據庫中存儲圖像的一些缺點。

http://forum.codecall.net/topic/40286-tutorial-storing-images-in-mysql-with-php/

你需要確保你將數據讀入的領域。不只是文件指針:

// Temporary file name stored on the server 
$tmpName = $_FILES['image']['tmp_name']; 

// Read the file 
$fp  = fopen($tmpName, 'r'); 
$data = fread($fp, filesize($tmpName)); 
$data = addslashes($data); 
fclose($fp); 

// Now take the contents of data and store THAT 

簡而言之,imagecreatefromstring的回報,而不是文件本身的內容「的圖像資源將在成功返回」。您需要先閱讀該資源的內容,然後才能存儲它。使用您的代碼,進行以下更改:

function process_images(){ 
    global $mysql 
    $sql = "select id, image_o from image"; 
    $res = mysqli_query($mysqli, $sql); 
    if ($res){ 
     while ($ay = mysqli_fetch_array($res, MYSQLI_ASSOC)){ 
      $id = $ay['id']; 
      $im = imagecreatefromstring($ay['image_o']); 
      $tempFileName = '/tmp/' . $id . 'jpg'; 
      $imTempFile = imagegd($im, $tempFileName); 
      $fh = fopen($tempFileName, "r"); 
      $data = fread($fh, filesize($tempFileName)); 

      // do something useful with the image 
      $sql2 = "update image set image_r = '{$data}' where id = $id"; 
      $res2 = mysqli_query($mysqli, $sql2); 
      if ($res2){ 
       // blah blah 
      }else{ 
       echo mysqli_error($mysqli)." in res2"; 
      } 
      //delete the temp file 
      unlink($tempFileName); 
     } 
    }else{ 
     echo mysqli_error($mysqli)." in res"; 
    } 
} 
+0

您好Joshua,感謝您的回覆,但您似乎在說我的blob只是對原始文件的引用,而實際上它是一個包含完整映像的編碼字符串。您建議的代碼生成「fread():提供的資源不是」中的有效流資源。 –

+0

是的,經過進一步的檢查,看起來您正試圖將圖像從一列中拉出數據庫,然後將其放回另一列?我不知道你爲什麼要這樣做。在表示「$ im = imagecreatefromstring($ ay ['image_o'])」的行處,嘗試在$ im上做一個var轉儲。我很好奇你回來的是什麼。它應該是一個文件指針,但如果$ ay ['image_o']不能被解釋爲圖像,將會出錯。您可能需要重新開始存儲圖像的位置。 –

+0

你說得對,我的示例代碼試圖將圖像從一列複製到另一列。真正的代碼會操縱GD中的圖像,但我刪除了這個問題來突出顯示問題。 image.image_o中的圖像是可以的,我知道這一點,因爲我可以使用它們在網頁上提供圖像。我嘗試在代碼中操作blob的方式有點問題 - 只是不知道該怎麼做。對imagecreatefromstring($ ay ['image_o'])的調用產生一個GD可以操作的對象。我懷疑我想要一個反函數:「stringcreatefromimage」,麻煩是,它不存在。 –

相關問題