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

PHP+MySQL文件存儲數據庫實戰:BLOB vs 文件系統權衡與完整上傳下載系統

     編輯:PHP 相關知識

兩大存儲策略對比

維度數據庫存儲 (BLOB/LONGTEXT)文件系統存儲
完整性事務/備份/權限原子性需額外機制保證
性能大文件查詢慢、佔用連接Web Server靜態服務極快
體積Base64膨脹33% / 二進制同大原始大小
緩存難利用瀏覽器/CDN緩存原生支持ETag/Last-Modified
遷移跨庫遷移簡單需同步文件目錄

推薦架構:數據庫存元數據 + 文件系統存內容


CREATE TABLE uploads (
  id INT AUTO_INCREMENT PRIMARY KEY,
  filename VARCHAR(255) NOT NULL,
  mime_type VARCHAR(100),
  file_size BIGINT,
  storage_path VARCHAR(500) NOT NULL, -- 相對路徑
  upload_time DATETIME DEFAULT CURRENT_TIMESTAMP,
  uploader_id INT,
  UNIQUE KEY uk_path (storage_path)
);

完整上傳下載系統 (5文件)

  1. file.sql:上述建表語句
  2. upload.php:上傳表單 + MAX_FILE_SIZE隱藏域限制
  3. submit.php:
    
    // 1. 驗證類型/大小
    // 2. 生成唯一路徑: uploads/YYYYMMDD/uuid.ext
    // 3. move_uploaded_file($tmp, $dest)
    // 4. 入庫元數據
    // 5. 返回文件ID
    
  4. show_info.php:列表顯示(文件名、大小、時間、下載鏈接)
  5. show_file.php:安全下載
    
    // 1. 驗證ID合法性
    // 2. 設置Header: Content-Type, Content-Disposition, Content-Length
    // 3. readfile($fullPath) 或 X-Sendfile (Nginx/Apache模塊)
    // 4. 記錄下載日志
    

關鍵安全加固

  • 文件類型驗證:finfo_file()檢測MIME,不信任擴展名
  • 路徑遍歷防護:basename()、禁止../
  • 執行權限隔離:上傳目錄禁用腳本執行 (Nginxlocation ~ \.php$ {deny all;})
  • 大文件分片上傳/斷點續傳 (Plupload/Resumable.js)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved