2012-03-12 201 views
-1

我已經提供的圖片上傳到mysql數據庫問題與PHP從MySQL檢索圖像

編碼我也做

$content = addslashes($content); 
    $content = base64_encode($content); 

那之後我已經測試圖像之前之前使用下面的代碼數據庫它輸入正常。

但是,每當我嘗試下載相同的圖像時,它在文件系統上保存的很好,但從不讓我查看它。因爲,它給我不正確的圖像文件。爲什麼如此

$file_data= $this->get_attachment($id); 
      $content = $file_data['content']; 
       $content = stripslashes($content); 
      $content = base64_decode(); 
      header("Content-length: ". strlen($content)); 
      header("Content-type: ".$file_data['filetype']); 
      header("Content-Disposition: attachment; filename=".$file_data['filename']); 
      echo $content; 

急需幫助將不勝感激。

+0

什麼是你正在存儲base64字符串的MySQL列的數據類型?如果它是varchar而不是TEXT或BLOB,則可能會截斷。 – 2012-03-12 13:01:46

+0

...並且根據大小,可以用TEXT和BLOB截斷。 – hakre 2012-03-12 13:03:43

+0

我已經使用LongBLOB,所以基本上它不是一個截斷問題 – 2012-03-12 13:05:30

回答

1

您正在發送base64編碼字符串的文件長度$file_data['content']而是發送解碼後的長度爲$content

$content = base64_decode($file_data['content']); 
// Send the Content-length of the decoded data $content 
// Should work, since strlen() is binary safe 
header("Content-length: ". strlen($content)); 
+0

感謝您的緊急答覆,我已經測試了它,但是,沒有運氣 – 2012-03-12 12:58:35

0

爲什麼會這樣[?]

已存儲一些數據到數據庫中。在檢索時,你沒有得到原始數據。這就是爲什麼。

這是什麼造成的?可能有很多事情導致這種情況。從你在你的問題已經提出的這些信息,我只能猜測:

  • 錯誤的長度給(你的情況另存爲過程所期望的更多的字節然後發送和襯墊用NULL字節或別的文件深奧)。
  • 給出的數據錯誤。您從數據庫檢索到的數據可能由於截斷而不再是原始數據,例如,您存儲數據的字段太小而無法保存所有數據。

請仔細檢查您的代碼的編碼/解碼部分(測試它!)並確保database column has a fitting type­Docs以及存儲您的數據。將原始內容的長度與從數據庫中檢索的長度進行比較。另外,您可以爲數據添加校驗和(例如md5),以測試數據是否已更改。

+0

當我檢索文本文件時,它工作正常,但每當我去尋找二進制文件,它給了我這樣的困難時期。 – 2012-03-12 13:21:40

+0

最初的圖像數據有多大(以字節爲單位)? 'base64-encode'甚至會使它變大。並且列旁邊的大小有限制,例如,用於與數據庫進行通信。我建議你首先刪除base64編碼,因爲LONGBLOB數據類型非常好地存儲二進制數據。 – hakre 2012-03-12 13:25:51

+0

我剛剛測試了一件事,但不知道爲什麼發生這樣的事情,我上傳的圖像是680KB,但我下載的圖像是698 KB – 2012-03-12 13:50:33