首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

PHP + MySQL 輸出圖片到瀏覽器:必須設定 Content-Type 輸出二進位流

     編輯:程式設計疑難解答

現象:直接 `echo $row['image']` 輸出亂碼 (二進位被當文字顯示)。

根因:缺少 HTTP 標頭 `Content-Type: image/...`,瀏覽器預設 `text/html` 解析二進位 → 亂碼

正確流程

  1. 資料庫欄位型別:`BLOB` / `MEDIUMBLOB` / `LONGBLOB` (儲存二進位)。
  2. 查詢取得二進位資料 (字串型變數實際含二進位位元組)。
  3. **輸出前送標頭**:`header('Content-Type: image/jpeg');` (或 png/gif/webp)。
  4. 直接 `echo $blobData;` 或 `readfile()` (若存檔案路徑)。
  5. **腳本結束前不得有任何空白/換行/HTML**,否則圖片損壞。

完整代碼 (PDO)


prepare("SELECT image_data, mime_type FROM images WHERE id = ?");
$stmt->execute([$id]);
$row = $stmt->fetch(PDO::FETCH_ASSOC);

if (!$row) { http_response_code(404); exit; }

// 關鍵:送正確 MIME
header('Content-Type: ' . $row['mime_type']); // 如 image/jpeg
header('Content-Length: ' . strlen($row['image_data']));
// 可選快取
header('Cache-Control: public, max-age=31536000');
header('ETag: "' . md5($row['image_data']) . '"');

echo $row['image_data']; // 直接輸出二進位
exit; // 確保無額外輸出
?>

HTML 引用


動態圖片

常見坑

  • 資料庫存的是 **Base64 字串** → 需 `echo base64_decode($row['image_data']);` 並對應 MIME。
  • 腳本開頭有 BOM / 空白行 → 圖片損壞,**檔案儲存為 UTF-8 無 BOM**。
  • 錯誤訊息 `echo "錯誤";` 混在二進位中 → 圖片損壞,**錯誤時 `http_response_code(404); exit;`**。
  • 大圖記憶體耗盡 → 改用 `readfile($path)` 或分塊 `fread` 輸出。

核心口訣:**查詢 → `header('Content-Type: image/...')` → `echo $blob` → `exit`,中間絕無多餘字元**,瀏覽器即可正確渲染資料庫圖片。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved