首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 將圖片檔案輸出為二進制流:header 設定、filesize/fread 輸出與 Content-Type 動態判斷

     編輯:PHP 綜合知識

直接輸出圖片二進制流可實現:圖片防盜鏈代理、動態水印合成後輸出、權限控制下載、資料庫 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 後抓取遠端圖片輸出。
  • 動態水印:GD/ImageMagick 合成水印後直接 imagepng($im) 輸出,無需落地儲存。
  • 私有資源:用戶上傳的身分證、合約等敏感圖片,存放非公開目錄,經權限檢查後輸出。
  • 資料庫 Blob:header(...); echo $row['image_blob']; 直接輸出資料庫二進制欄位。

掌握二進制流輸出細節,是構建圖片處理微服務、受保護資源存取層、高效能靜態資源代理的核心技能。

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