| 維度 | 存數據庫 | 存文件系統 + 路徑 |
| 查詢性能 | 極差(BLOB 讀取慢、緩存失效) | 優(只查字符串,索引友好) |
| 備份/遷移 | SQL 檔巨大、還原慢 | 文件與 SQL 分離,並行備份 |
| CDN 加速 | 不可用 | 直接配置 CDN 域名 |
| 縮圖/多尺寸 | 難以處理 | 生成多版本存不同路徑 |
推薦目錄結構設計
/upload/
├── avatar/
│ ├── user_10001/
│ │ ├── avatar_64x64.jpg
│ │ ├── avatar_128x128.jpg
│ │ └── avatar_256x256.jpg
│ └── user_10002/
│ └── ...
├── post_image/
│ ├── 2024/
│ │ ├── 01/
│ │ │ ├── post_88888_1.jpg
│ │ │ └── post_88888_2.jpg
│ │ └── 02/
│ └── 2025/
└── temp/ # 臨時上傳,定時清理
數據庫表設計
CREATE TABLE user_avatar (
user_id BIGINT PRIMARY KEY,
avatar_path VARCHAR(500), -- 相對路徑:avatar/user_10001/avatar_128x128.jpg
avatar_cdn_url VARCHAR(500), -- 可選:CDN 完整 URL
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
CREATE TABLE post_image (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
post_id BIGINT NOT NULL,
image_path VARCHAR(500) NOT NULL, -- 相對路徑
sort_order INT DEFAULT 0,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Android 端上傳流程
- 壓縮圖片(
Bitmap.compress 或 ThumbnailUtils 生成多規格)。
- 上傳至服務器 API(
Multipart/Form-Data,OkHttp/Retrofit)。
- 服務器保存文件,返回
相對路徑 或 CDN URL。
- 客戶端保存路徑,顯示時拼接
BASE_IMAGE_URL + path 加載(Glide/Picasso/Coil)。
雲存儲替代方案(阿里云 OSS / 騰訊云 COS / AWS S3)
- 客戶端直傳(獲取臨時簽名),減輕應用服務器帶寬。
- 回調通知服務器保存路徑入庫。
- 自帶 CDN、圖片處理(縮放、水印、格式轉換)。
避坑指南
- ❌ Base64 存庫 —— 體積膨脹 33%,查詢緩存失效。
- ❌ 絕對路徑入庫 —— 遷移服務器/域名變更時全量更新。
- ✅ 相對路徑 + 配置域名前綴 —— 遷移只需改配置。
- ✅ 圖片異步處理(壓縮、水印、生成縮圖)進消息隊列,不阻塞上傳響應。
「文件歸文件,數據歸數據」—— 成熟的動態發佈架構,從存儲層面就決定了擴展性上限。
- 上一篇文章: PHP 表單提交未輸入字段導致 Undefined Index 錯誤:isset/empty 防御性檢查與默認值賦值
- 下一篇文章: Java for/while 循環等價轉換規則:for (a;b;c) {d} ⇔ a; while(b) {d; c} 及 for-each 轉換
Copyright ©
程式碼之家 All Rights Reserved