在早期的 PHP 開發中,將圖片直接存入 MySQL 資料庫是一種常見的做法。雖然現代架構傾向於將檔案存放於檔案系統或物件儲存服務,但理解資料庫二進位儲存的原理對於維護舊系統或特定場景仍具參考價值。本文將完整呈現一個基於 Linux + Apache + PHP + MySQL (LAMP) 的圖片上傳、存儲與瀏覽範例。
首先建立一張 image 資料表,欄位包含主鍵、描述、檔名、大小、MIME 類型以及二進位資料欄位:
USE test;
CREATE TABLE image (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
description TEXT,
filename VARCHAR(50),
filesize INT,
filetype VARCHAR(50),
filedata LONGBLOB
);
單一 PHP 檔案透過 cmd 參數控制四種模式:list(列表)、form(上傳表單)、store(儲存處理)、read(圖片輸出)。程式碼採用雙重 switch 結構,先驗證參數合法性,再分派處理。
查詢所有圖片記錄,輸出 HTML 表格並嵌入 <img> 標籤,其 src 指向 ?cmd=read&id=... 實現動態圖片輸出。
輸出 multipart/form-data 表單,包含描述文字區與檔案選擇欄位,表單提交目標為 ?cmd=store。
接收上傳檔案,讀取二進位內容並以 addslashes() 轉義後寫入資料庫。注意:此為舊式寫法,現代應改用 mysqli_real_escape_string() 或預處理語句。
根據 id 查詢 filetype 與 filedata,發送正確的 Content-Type 標頭後直接輸出二進位資料,瀏覽器即可顯示圖片。
mysql_* 函式,應升級為 mysqli 或 PDO。getimagesize() 驗證。<?php
// 參數驗證
switch ($cmd) {
case 'read': case 'list': case 'form': case 'store': break;
default: $cmd = 'list';
}
// 業務分派
switch ($cmd) {
case 'read': // 輸出圖片二進位資料
// ... 連線資料庫、查詢、header 輸出 ...
break;
case 'list': // 顯示列表與縮圖
// ... 輸出 HTML、查詢列表、迴圈產生 img 標籤 ...
break;
case 'form': // 顯示上傳表單
?>
<html><body>
<form action="?cmd=store" method="post" enctype="multipart/form-data">
描述:<br><textarea name="description"></textarea><br>
檔案:<input type="file" name="file"><br>
<input type="submit" value="上傳">
</form>
</body></html>
<?php
break;
case 'store': // 處理上傳並存庫
// ... 讀取暫存檔、addslashes、INSERT SQL ...
break;
}
?>
此範例展示了 PHP 操作 MySQL BLOB 欄位的經典模式。雖然技術棧已老舊,但其「單一入口、參數分派、資料庫二進位讀寫」的架構思維仍具教學意義。實務上請務必套用現代安全防護與資料庫抽象層。