兩大存儲策略對比
| 維度 | 數據庫存儲 (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文件)
- file.sql:上述建表語句
- upload.php:上傳表單 +
MAX_FILE_SIZE隱藏域限制
- submit.php:
// 1. 驗證類型/大小
// 2. 生成唯一路徑: uploads/YYYYMMDD/uuid.ext
// 3. move_uploaded_file($tmp, $dest)
// 4. 入庫元數據
// 5. 返回文件ID
- show_info.php:列表顯示(文件名、大小、時間、下載鏈接)
- 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()、禁止../
- 執行權限隔離:上傳目錄禁用腳本執行 (Nginx
location ~ \.php$ {deny all;})
- 大文件分片上傳/斷點續傳 (Plupload/Resumable.js)