2012-01-29 85 views
0

我有一個名爲users的表,每行(用戶)都有一個圖像。從mysql存儲圖像創建縮略圖

的圖像存儲爲BLOB在使用此代碼MySQL數據庫:

$filename = $_FILES['image']['tmp_name']; 
$size = getimagesize($filename); 
$handle = fopen($filename , "rb"); 
$content = fread($handle , filesize($filename)); 
fclose($handle); 
unlink($filename); 
$image = base64_encode($content); 
// .... send query to database .... 

這個工作在第一,但隨着越來越多的圖像必須在每一頁中顯示,它變得非常加載,所以現在我想用php GD創建縮略圖,保存在服務器的文件系統中。

我有下面的代碼,但我不知道該怎麼做才能從數據庫中讀取圖像,所以我可以創建它的縮略圖。

$query = "SELECT * FROM users;"; 
$result = mysql_query($query); 
while($row = mysql_fetch_array($result)) { 
    $uploaded_image = base64_decode($row['image']); 
    $size = getimagesize($uploaded_image); <-------------------- 
    $dimension_x = 73; 
    $dimension_y = 73; 
    $directory = 'views/images/generated/people/'; 
    do{ 
    $filename = random_32(); 
    $filename = $directory.$filename.'.jpg';  
    } while(file_exists($filename)); 
$image = imagecreatefromjpeg($uploaded_image); 
$thumb = imagecreatetruecolor($dimension_x , $dimension_y); 
$size = getimagesize($uploaded_image); 
imagecopyresampled($thumb , $image , 0 , 0 , 0 , 0 , $dimension_x , $dimension_y , $size['0'], $size['1']); 
imagejpeg($thumb , $filename , 100); 
} 

我想找到什麼,我應該把箭頭放在哪裏使腳本工作。

所有現在所做的就是輸出

Warning: getimagesize(ÿØÿà): failed to open stream: No such file or directory in /var/www/play/ns4/models/create_thumbs_people.php on line 12 

對於數據庫中的每個條目。

---- ---- EDIT

忘記提到,random_32()是生成32個字符長隨機數序列,以使圖像被命名的功能。

回答

2

而這裏的原因很多,在數據庫中存儲的文件是一個壞主意一個...

和getimagesize()的作品上的文件,而不是字符串。既然你已經有了一個字符串的原始圖像,使用imagecreatefromstring(),那麼imagesx()和imagesy()函數來獲得尺寸:

while($row = mysql_fetch_array($result)) { 
    $uploaded_image = base64_decode($row['image']); 
    $image = imagecreatefromstring($uploaded_image); 
    $uploaded_x = imagesx($image); // X dimension 
    $uploaded_y = imagesy($image); // Y dimension 
    etc.... 

注意imagecreatefromstring實際上有一點聰明,並能計算出圖像的類型是什麼類型,不像那些拙劣的createfromgif/jpg/png/etc ...函數,它們只適用於那些特定的文件類型。

+0

我試過了你的代碼,改變了imagecopyresampled中的值,它就像一個魅力! – ppp 2012-01-29 02:32:23

2

你在正確的軌道上,問題是$ uploaded_image是圖像的內容而不是文件路徑。 getimagesize需要一個文件名作爲第一個參數。

概念,這裏有一個需要作出的改變:

  • 寫的$ uploaded_image內容到一個臨時位置
  • 調用和getimagesize上臨時位置

下面是一些示例代碼(未經測試):

$uploaded_image = base64_decode($row['image']); //this is from your code above, should work fine 
$uploaded_temp_file = tempnam(sys_get_temp_dir(), 'user_image'); //generate a temporary file name in your OS's temp folder 
$uploaded_temp_res = fopen($uploaded_temp_file, 'wb'); //open the file for binary write 
fwrite($uploaded_temp_res, $uploaded_image); //commit binary data to the file 
fclose($uploaded_temp_res);  //close the file handle 
$size = getimagesize($uploaded_temp_file);  //finally, get the image size 

請注意,螞蟻添加錯誤處理和不。

+0

謝謝你的時間。當我看到你的答案時,我已經走了另一條路,所以我做了@Marc B的建議。 – ppp 2012-01-29 02:38:42