2009-05-25 161 views
1

嗨我的數據庫中有一個圖像表。這些存儲爲blob以及諸如圖像類型&名稱的詳細信息。從blob顯示圖像mysql

我有問題顯示圖像,我得到的只是一個帶有紅色十字的白色盒子。 代碼:

<?php 

include '../connection.php'; 

$ID = $_GET['id']; 

$query = "SELECT * FROM `images` WHERE `image_id` = '$ID'"; 

$result=mysql_query($query); 
$row = mysql_fetch_array($result); 

$image = $row['image']; 
$image_type= $row['image_type']; 

header("Content-type: $image_type"); 
print $image; 

exit; 

?> 

感謝

+0

什麼是存儲在數據庫?怎麼樣 ? 你知道blob類型限於64k嗎? – 2009-05-25 16:48:55

+0

實際圖像存儲爲數據庫中的blob 其餘數據爲varchar。該圖像在數據庫中顯示爲[BLOB-64.0 KiB] – Elliott 2009-05-25 16:50:54

+0

圖片是否上傳並存儲在小於64K的db中? 圖像類型是正確的MIME類型,如圖像/ PNG或圖像/ JPEG? – 2009-05-25 17:03:11

回答

3

那麼這裏是一個簡短的答案。

<?php 
include '../connection.php'; 
$id = (int)$_GET['id']; 
$query = "SELECT * FROM `images` WHERE `image_id` = '$id'"; 

$result=mysql_query($query); 
$row = mysql_fetch_array($result); 

$image = $row['image']; 
$image_type= $row['image_type']; 
$size = $row['image_size']; 
//alternative 
/* list($image, $image_type, $size) = array(
             $row['image'], 
             $row['image_type'], 
             $row['image_size'] 
            ); 
*/ 
$ext = explode('/', $image_type); 
$name = $id . '.' . $ext[1]; 

header("Content-type: $image_type"); 
header("Content-length: $size"); 
header("Content-Disposition: attachment; filename=$name"); 

print $image;  
exit; 

檢查blobtype是它能夠將數據存儲多達16M

+0

我已經添加了它們,並且將它更改爲MEDIUMBLOB,但仍然一樣。 – Elliott 2009-05-25 17:02:05

+1

Content-Dispostion標題只能用於下載。它不應該用於發送標記的圖像。 – 2009-05-25 17:03:44

+0

我刪除那..因爲在FF它試圖下載文件。 – Elliott 2009-05-25 17:08:18

0

這看起來似乎是工作,什麼錯?

嘗試明確指定字段:

SELECT image, image_type FROM ... 

當您從數據庫中查詢,會發生什麼?

你喜歡加載圖像:

<img src="image.php?id=12"> 

或者你加載PHP作爲自己的頁面?

+0

我將圖像加載到它自己的頁面上 ,比如view_image.php?id = 2 我從查詢中沒有發現錯誤,但在Firefox中運行我得到頁面中顯示的URL。但在IE瀏覽器中,我得到一個帶紅叉的圖片框? – Elliott 2009-05-25 17:00:53

+0

嘗試刪除「退出」? – Andomar 2009-05-25 17:06:14

0

夫婦的事情,試圖

  1. 或許真的是失敗的最小MEDIUMBLOB和它返回一個錯誤味精在html而不是預期的圖像

  2. 是正確存儲在數據庫中的content_type或您是否只存儲圖像的文件擴展名Ë

內容類型應該是這個樣子

image/gif 
image/jpeg 
+0

圖像類型在數據庫中顯示爲「image/pjpeg」 – Elliott 2009-05-25 16:57:51

0

也許你可以嘗試

$row = mysql_fetch_assoc($result); 

代替

$row = mysql_fetch_array($result); 
+0

我認爲默認情況下,mysql_fetch_array將存儲數字和名稱,所以$ row [0]和$ row ['columnname']是有效的 – Andomar 2009-05-25 17:05:30

+0

你學習東西新的每一天:) – bumperbox 2009-05-25 17:09:57

1

要調試這個問題,我想建議註釋掉Content-type標題行,然後敲擊t他直接在瀏覽器中訪問網址。這將允許您查看PHP可能發出的任何錯誤,警告或通知。

0

您在評論中說過表格最初表示「[BLOB - 64.0 KiB]」,但是您之後將其更改爲「MEDIUMBLOB」。這將擴大您可以存儲的大小,但是所有現有數據仍將被截斷爲64KiB。

請確保您使用的字段類型足夠大以存儲要存儲的數據(16MB在MEDIUMBLOB中,或〜4GB在LONGBLOB中,我確定),然後重新插入所有數據。

除了上面提到的安全問題,我不明白爲什麼代碼不能工作,除了數據庫問題。

+0

我已經做了這一點,並重新上傳了一張圖片,現在顯示爲 [BLOB - 369.9 KiB] – Elliott 2009-05-25 17:45:35

+0

當您訪問它時,它在頁面上顯示正確嗎? (在原始問題中使用代碼)。我試過這個確切的代碼,它似乎工作正常(使用jpeg,而不是pjpeg雖然) – Drakia 2009-05-25 19:08:40

+0

謝謝,但沒有它沒有工作。 – Elliott 2009-05-25 21:50:58

0

或者,如果你不想創建一個單獨的PHP文件,可以內嵌它

<?php 
// retrieve blob into $img 
?><img src='data:image/png;base64,<?php echo base64_encode($img);?>' alt='Image <?php echo $id;?>'>