我堅持用錯誤獲取圖像從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;
什麼是您的圖像字段的字段類型?如果是文本,那麼看起來像它們是有效文本的圖像的BINARY數據中的任何字節都將受制於字符集轉換規則。二進制數據應該存儲在blob/binary字段中,而不是文本。 – 2015-02-10 14:42:38
完全脫離話題:爲什麼地球上你將圖像存儲在數據庫中?文件系統本身就是一個數據庫,在表中保存一個引用,如'filename','save','load'(get),'delete','restore'從服務器文件系統本身恢復你的映像。 – davidkonrad 2015-02-10 14:42:42
@MarcB的MIME類型是內容類型\t image/jpeg,$ type = image/jpeg 問題是舊網站做到了這一點,我必須在移動到新的CMS時保留網站的舊內容,所以我需要這個image.php腳本才能使舊內容顯示圖像。 – AndyZ 2015-02-10 14:45:28