2009-02-23 30 views
2

一位客戶剛要我通過他們的網站解決問題。我沒有建立它,但這是發生了什麼。爲什麼我的圖像僅以部分顯示方式存儲爲MySQL longblobs?

圖像以longblobs的形式存儲在數據庫中。在轉移到新服務器之前,一切正常。在新的服務器上,某些圖像僅部分顯示。即使圖像以所需的寬度和高度顯示,超過一半的圖像可能是白色或灰色。 編輯:只有在服務器更改後上傳的圖像受到影響!

這是用於讀取圖像轉換成字符串爲分貝插入:

move_uploaded_file($_FILES['imagefile1']['tmp_name'],"tmppic.img")) 
$tmpstr = fopen("tmppic.img","rb"); 
$image = addslashes(fread($tmpstr,filesize("tmppic.img"))); 

下面是用於顯示圖像的PHP函數: imagecreatefromstring, imagecreatetruecolor, imagecopyresampled, imagejpeg

由於服務器移動後發生這種情況,我懷疑服務器配置。

這是怎麼回事?

+0

好的,所以只有一些圖像會受到影響,並且只有自服務器更改顯示不正確才上載的圖像。自服務器更改顯示不正確或僅顯示某些圖像後,是否上傳所有圖像? – 2009-02-23 23:23:31

回答

3

好吧,算出來。看下面的代碼。

if (move_uploaded_file($_FILES['imagefile1']['tmp_name'],"tmppic.img")){ 
$tmpstr = fopen("tmppic.img","rb"); 
$image = addslashes(fread($tmpstr,filesize("tmppic.img"))); 

上傳的文件被移動到tmppic.img文件中。該文件被不斷使用。問題是文件大小(「tmppic.img」)正在返回文件的大小,之前是move_uploaded_file。因此,如果之前的tmppic.img文件大小爲120k,並且新上傳的文件較大,則只會讀取120K的信息,因此圖片中的灰色區域會被讀取。

我固定用

$file_size = $_FILES['imagefile1']['size']; 
$image = mysql_real_escape_string(fread($tmpstr,$file_size)); 

這是一個錯誤替換文件大小( 「tmppic.img」)的問題?

3

不知道是什麼讓你失望,但你肯定需要將addslashes()更改爲mysql_real_escape_string()。 SQL注入ahoy ...

0

可能數據在服務器移動過程中被破壞 - 特別是如果數據被轉儲然後重新插入。你能確認整個圖像數據實際上在數據庫中嗎?

編輯:剛剛看到您的編輯問題。你能否確認新圖像被完全插入到數據庫中呢?這可能是一個插入問題。

0

如果圖像通過ftp傳輸到新服務器,可能是傳輸模式設置不正確(即ascii與二進制)。如果以ascii ftp模式傳輸二進制文件,它可能會將圖像中的一些字節解釋爲新行並嘗試將它們轉換爲windows(CRLF)或UNIX(LF)等模式。這通常會破壞圖像,因此不完全可讀。

0

你使用的是什麼MySQL庫?某些版本的MySQLi庫存在從數據庫中正確檢索blob的問題。

我會驗證您是否在兩臺服務器上運行相同版本的PHP和相關的MySQL庫。

1

請確認您的圖像字段設置爲正確的BLOB類型。

我有同樣的問題,這是一個死的簡單的解決方案;我的圖像字段設置爲「Blob」,而不是「LongBlob」。我的數據庫無法在現場分配足夠的空間來存儲圖像數據。將其更改爲LongBlog並且效果很好!

相關問題