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

PHP 圖片存儲與瀏覽實戰:基於 LAMP 架構的完整範例

     編輯:PHP 綜合知識

前言

在早期的 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 結構,先驗證參數合法性,再分派處理。

1. 圖片列表模式 (cmd=list)

查詢所有圖片記錄,輸出 HTML 表格並嵌入 <img> 標籤,其 src 指向 ?cmd=read&id=... 實現動態圖片輸出。

2. 上傳表單模式 (cmd=form)

輸出 multipart/form-data 表單,包含描述文字區與檔案選擇欄位,表單提交目標為 ?cmd=store。

3. 儲存處理模式 (cmd=store)

接收上傳檔案,讀取二進位內容並以 addslashes() 轉義後寫入資料庫。注意:此為舊式寫法,現代應改用 mysqli_real_escape_string() 或預處理語句。

4. 圖片讀取模式 (cmd=read)

根據 id 查詢 filetype 與 filedata,發送正確的 Content-Type 標頭後直接輸出二進位資料,瀏覽器即可顯示圖片。

安全與改進建議

  • SQL 注入風險:原始碼直接拼接變數進 SQL,極易受攻擊。必須改用 PDO 或 MySQLi 預處理語句。
  • 資料庫連線:使用已棄用的 mysql_* 函式,應升級為 mysqli 或 PDO。
  • 檔案驗證:缺乏檔案類型、大小、惡意腳本的檢查,建議加入 MIME 類型白名單與 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 欄位的經典模式。雖然技術棧已老舊,但其「單一入口、參數分派、資料庫二進位讀寫」的架構思維仍具教學意義。實務上請務必套用現代安全防護與資料庫抽象層。

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