直接輸出圖片二進制流可實現:圖片防盜鏈代理、動態水印合成後輸出、權限控制下載、資料庫 Blob 讀取顯示。本文示範最小化四行代碼實現,並補充 Content-Type 動態判斷、快取控制、錯誤處理、大檔案分塊輸出等生產級完善方案。
效果:瀏覽器直接顯示圖片,與 <img src="1.jpg"> 效果一致,但可在 PHP 中插入權限檢查、水印、統計等邏輯。
| 環節 | 關鍵點 |
|---|---|
| MIME 類型 | 必須準確:JPEG→image/jpeg、PNG→image/png、GIF→image/gif、WebP→image/webp、SVG→image/svg+xml。錯誤導致瀏覽器無法渲染或以檔案下載。 |
| 讀取模式 | fopen($file, 'rb') 二進制模式 (b flag),Windows 下避免 \r\n 轉換損壞二進制資料。 |
| 分塊輸出 | 大檔案 (超過 memory_limit) **必須**分塊 fread($fp, 8192) + flush(),不可 file_get_contents 或一次 fread 全部。 |
| 快取標頭 | ETag、Last-Modified、Cache-Control 配合 304 回應,大幅降低頻寬與伺服器負載。 |
| 範圍請求 | Accept-Ranges: bytes + 處理 HTTP_RANGE 標頭,支援視頻拖曳、大圖分段載入。 |
<img src="/proxy.php?url=...">,PHP 驗證 Referer/Token 後抓取遠端圖片輸出。imagepng($im) 輸出,無需落地儲存。header(...); echo $row['image_blob']; 直接輸出資料庫二進制欄位。掌握二進制流輸出細節,是構建圖片處理微服務、受保護資源存取層、高效能靜態資源代理的核心技能。