2015-02-10 163 views
0

我堅持用錯誤獲取圖像從MySQL在PHP導致損壞的圖像

「圖像‘...... image.php?ID = 1878年’無法顯示,因爲它包含錯誤。

這是我從db中檢索圖像內容的代碼db中的數據是正確的,因爲同一個文件完全顯示了一些舊的php代碼實際上,我使用的代碼是完全一樣的舊代碼,我只是從許多鏈接(包含)的PHP文件中提取它,顯然我錯過了一些東西。

$query="SELECT image_original_file, mime_type, {$field_content} as content, {$field_content}_md5 as imhash, CHAR_LENGTH({$field_content}) as leng FROM IMAGES WHERE ID_image={$_GET['id']}"; 
$res=mysql_query($query,DB_CON); 
$myRow = mysql_fetch_row($res); 
//Of course this echo statement is just for debuging, as echo causes the default headers to be sent. 
echo "Fetched content length:".mb_strlen($myRow[2])." and MySQL length ".$myRow[4]; 
list($name,$type,$content,$imhash,$length)=$myRow; 

此處的輸出顯示php中的內容長度爲29179bytes,但在MySQL中爲28605(這是我保存圖像時的正確大小)。 我想知道爲什麼在這些代碼行之後,PHP中的內容大小不同。數據庫中的文件內容不是base64編碼的,原始代碼也不會對從數據庫中檢索的內容進行任何操作。我比較了舊代碼和「新」代碼的標題,除了內容長度以外的所有內容都是相同的。我懷疑這是一些特徵問題?

我想:

mysql_set_charset('utf8',$con); 
mysql_query("SET character_set_results = 'utf8', character_set_client = 'utf8', character_set_connection = 'utf8', character_set_database = 'utf8', character_set_server = 'utf8'", DB_CON); 
mysql_query("SET NAMES utf8",DB_CON); 

但問題仍然存在。我會很樂意提供一些建議。

的圖像被髮送到瀏覽器這樣的:

header("ETag: \"{$imhash}\""); 
header("Expires: " . gmdate("D, d M Y H:i:s") . " GMT"); 
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); 
header("Cache-Control: must-revalidate"); 
header("Accept-Ranges: bytes"); 
header("Content-Length: ".mb_strlen($content)); 
header("Content-Type: {$type}"); 
header("Content-Disposition: inline; filename=\"{$name}\";"); 
echo $content; 
+0

什麼是您的圖像字段的字段類型?如果是文本,那麼看起來像它們是有效文本的圖像的BINARY數據中的任何字節都將受制於字符集轉換規則。二進制數據應該存儲在blob/binary字段中,而不是文本。 – 2015-02-10 14:42:38

+3

完全脫離話題:爲什麼地球上你將圖像存儲在數據庫中?文件系統本身就是一個數據庫,在表中保存一個引用,如'filename','save','load'(get),'delete','restore'從服務器文件系統本身恢復你的映像。 – davidkonrad 2015-02-10 14:42:42

+0

@MarcB的MIME類型是內容類型\t image/jpeg,$ type = image/jpeg 問題是舊網站做到了這一點,我必須在移動到新的CMS時保留網站的舊內容,所以我需要這個image.php腳本才能使舊內容顯示圖像。 – AndyZ 2015-02-10 14:45:28

回答

1

你的圖像數據被轉義所以例如引號字符"正在變成\"從而破壞圖像。

在您的php.ini配置文件中確保magic_quotes_gpc,magic_quotes_runtimemagic_quotes_sybase不是On

PHP Magic Quote Directives

+0

非常感謝。我讀了關於可能的esacpe原因,但是快速瀏覽了顯示magic_quotes_gpc關閉的設置,我沒有檢查magic_quotes_runtime,它是「ON」,因此在代碼中添加了這個「set_magic_quotes_runtime(0);」這個問題已經解決了這個問題,所以在這個問題上浪費了很多時間 – AndyZ 2015-02-10 16:45:16

+0

很高興你知道了,我在其他兩個指令中加入了答案。 – 2015-02-10 16:49:33

+0

謝謝,我真的迷失了這個,我希望我已經明白了,但你確實;-) – AndyZ 2015-02-10 16:53:54