一支 800MB 的影片,讓整個網站掛掉 12 分鐘
某教育單位的講師上傳一支 800MB 課程影片,檔案先進了 PHP 記憶體,回傳 413 Request Entity Too Large,重試三次後記憶體吃滿,全站停擺 12 分鐘。帳單更難看:影片與程式放同一顆磁碟、靠應用層串流輸出,單月流量費比開發費還貴。這是「把上傳當成一個表單欄位」的必然結果。
適用情境 × 不適用情境
適合投資完整媒體庫:
- 使用者會上傳大於 100MB 的檔案(影片、設計原稿、掃描 PDF)
- 同一張圖要以多種尺寸出現(縮圖、主圖、OG 圖)
- 內容有付費牆或權限控管,網址被複製不能就外流
- 檔案超過 1 萬筆,需要標籤、搜尋、版本與重複偵測
- 有法遵需求:稽核軌跡、保存年限、刪除紀錄
不適合、別浪費預算:
- 形象官網,圖片一次上傳 30 張就不再變動
- 全站檔案低於 2GB 且無影片,CMS 內建媒體庫已足夠
- 上傳者只有 1–2 位同事,可接受雲端硬碟共享連結
- 產品仍在驗證期,還不確定使用者會不會上傳
替代方案矩陣:三條路的真實差距
| 方案 | 優點 | 缺點 | 成本級距 |
|---|---|---|---|
| A. 主機本地磁碟 | 開發最快、無跨網域設定 | 無法水平擴充、備份困難、流量走主機頻寬、磁碟滿就當機 | 開發 NT$15,000 起;主機升級費隨檔案量線性上升 |
| B. 物件儲存+CDN 自組 | 可攜、單價最低、轉檔與簽章規則可自訂 | 要自己處理直傳、轉檔佇列、快取失效與清理排程 | 開發 NT$60,000–150,000;Cloudflare R2 標準級 US$0.015/GB-月、對外流量免費,或 S3 Standard US$0.023/GB-月+外流約 US$0.09/GB |
| C. 全託管媒體 SaaS | 轉檔、縮圖、播放器、防盜連開箱即用 | 單價高、綁定深、超量計費難預測 | 開發 NT$40,000–80,000;Cloudinary 免費方案含 10GB 儲存與 20GB 觀看頻寬,付費依用量跳級 |
判斷公式:月外流量(GB)× 單價 × 12 < 自組開發費差額 就選 SaaS,反之選 B。影音型專案幾乎都會在第二年翻轉成 B 較划算。
完整流程拆解
- 第 1 週|規格定義:盤點檔案型別、最大尺寸、每日筆數、保存年限。交付《媒體規格表》與《權限矩陣》,工具 Notion。
- 第 2 週|架構設計:定直傳路徑、命名規則、轉檔規格(影片轉 H.264 720p/1080p HLS、圖片統一 WebP)。交付架構圖,工具 Figma。
- 第 3–5 週|核心開發:後端簽發預簽章網址,瀏覽器分片直傳物件儲存,不經過應用伺服器;完成觸發 webhook 寫入資料庫並丟進佇列。工具 Laravel Queue/BullMQ、Uppy、FFmpeg。
- 第 6 週|媒體庫後台:標籤、搜尋、替換、版本、批次與軟刪除。交付後台與操作手冊。
- 第 7 週|CDN 與防護:綁 Cloudflare 快取、設 Referer 白名單與簽章有效期(私有內容建議 15 分鐘)、開 WAF 速率限制、接 ClamAV。
- 第 8 週|壓測驗收:模擬 50 人同時上傳 500MB 檔案,量測失敗率與續傳成功率。交付驗收報告與監控看板(UptimeRobot+Sentry)。
真實成本完整拆解
以「月增 300GB、累積 3TB、月外流 5TB」的影音型專案估算:
- 開發費:直傳與續傳 NT$25,000/轉檔佇列 NT$30,000/媒體庫後台 NT$35,000/權限與簽章 NT$18,000
- 儲存費:3TB 放 R2 約 US$45/月,放 S3 Standard 約 US$69/月
- 流量費(最大隱藏費用):R2 外流 US$0;S3 直出 5TB 約 US$450/月,這一條就可能是全案最貴科目
- 轉檔運算:自架 FFmpeg 需一台 4 vCPU 工作機約 NT$1,800/月
- 常被漏算:物件操作費(R2 Class A 每百萬次 US$4.50、Class B US$0.36)、異地備份複本、掃毒授權、自訂網域與 SSL、孤兒檔案清理排程,以及每年 15–20% 維護費
ScriptWalker 的「檔案上傳與媒體庫系統建置」起價 NT$68,000,含直傳、轉檔佇列與基本後台;影音串流與 DRM 另計。
實施真相 vs 客戶想像
- 想像:上傳就是一個按鈕。真相:大檔要分片、續傳、處理斷線與重複提交,光上傳就佔模組 40% 工時。
- 想像:影片上傳完就能播。真相:30 分鐘影片轉多解析度 HLS 要 5–20 分鐘,前台必須有「處理中」狀態與通知。
- 想像:雲端存檔很便宜。真相:便宜的是儲存、貴的是流量,S3 與 R2 的年度差額可能超過整個開發費。
- 想像:網址很長沒人猜得到。真相:分享一次就永久外流,沒有簽章有效期等於沒有權限控管。
- 想像:上線後就不用管。真相:沒有清理排程,兩年後 30–40% 是孤兒檔案,你每月都在為它們付錢。
常見陷阱 × 怎麼避開
- 檔案先經過應用伺服器。解法:改用預簽章網址讓瀏覽器直傳,伺服器只發證與記帳。
- 只靠副檔名驗證型別。解法:用 magic bytes 檢查真實 MIME,以隨機 UUID 重新命名並剝除 EXIF。
- 轉檔跑在請求執行緒裡。解法:進佇列非同步處理,設重試上限與死信佇列,失敗能人工重跑。
- 私有內容用公開網址。解法:Bucket 全私有,只給短效期簽章網址,CDN 加 Referer 白名單。
- 沒有孤兒檔案清理。解法:上傳先寫「待確認」,24 小時未關聯業務資料自動刪除,每月對帳。
- 沒有掃毒與上傳配額。解法:觸發 ClamAV,未過關前隔離不供應;依帳號設容量上限、CDN 開速率限制。
成功指標 + 上線後 90 天路線圖
- 第 30 天:看上傳成功率(目標 >98%)、平均上傳耗時、413/逾時錯誤數;優化分片大小與續傳邏輯。
- 第 60 天:看轉檔佇列積壓(目標中位數 <5 分鐘)、失敗重試率、CDN 快取命中率(目標 >90%)。
- 第 90 天:看每 GB 實際成本、孤兒檔案比例(目標 <5%)、盜連攔截數;導入生命週期政策把冷資料轉入低頻存取層。
決策清單
- ☐ 你能說出單一檔案的最大允許尺寸嗎?
- ☐ 你知道每月新增容量與外流流量嗎?
- ☐ 上傳檔案中有需要權限控管的私有內容嗎?
- ☐ 你需要影片轉檔或多解析度串流嗎?
- ☐ 同一張圖需要三種以上尺寸嗎?
- ☐ 上傳者是不特定的外部使用者嗎?
- ☐ 你有稽核軌跡或保存年限的法遵要求嗎?
- ☐ 你的應用目前跑在多台伺服器上嗎?
- ☐ 你能接受轉檔延遲 5–20 分鐘嗎?
- ☐ 你有預算負擔每年 15–20% 維護費嗎?
- ☐ 你有人力維運佇列與監控嗎?
- ☐ 你需要跨雲搬遷的可攜性嗎?
- ☐ 你評估過流量費而不只是儲存費嗎?
勾 7 題以上就該做方案 B;勾 3 題以下,現成 CMS 媒體庫已足夠。
常見問題 FAQ
大檔上傳該用什麼技術?
超過 100MB 建議走分片上傳(multipart upload)+瀏覽器直傳。前端用 Uppy 或 tus 協定處理分片與斷點續傳,後端只簽發預簽章網址。網路中斷時能從失敗的分片繼續,不必整支重傳。
Cloudflare R2 和 AWS S3 該選哪一個?
看流量結構。外流量遠大於儲存量(影音、下載型網站)時,R2 因不收對外流量費通常勝出;已大量相依 AWS、需要成熟生命週期與分析生態者,S3 整合度較高。兩者都相容 S3 API。
防盜連要怎麼做才有效?
三層一起做:Bucket 保持私有、對外只給短效期簽章網址、CDN 設 Referer 白名單與速率限制。猜不到的長網址不是安全機制;付費內容再加單次播放憑證或 DRM。
已上線的舊系統可以改造嗎?
可以,分兩階段:先把新上傳導向物件儲存並保留舊檔讀取路徑,再用背景任務逐批搬遷舊檔並改寫資料庫欄位。3TB 以內多半兩到三週完成,不需停機。
下一步
正在評估媒體管線?我們提供 30 分鐘免費架構諮詢:帶著檔案型別、月增容量與流量估算,現場算出 A/B/C 三案的兩年總持有成本,並附《媒體規格表》範本讓你直接填。
- Email:[email protected]
- 電話:0916-224-047
- LINE:@ufv9089p