文件

影像處理流程

本頁說明 GET /c/img/*path 從判斷是否需要轉檔、libvips 處理順序到串流回應的完整流程。

分流判斷

GetFromPath 依序判斷,命中即回應並結束:

順序 條件 行為
1 路徑以 .pdf 結尾 以 application/pdf 串流原檔
2 路徑以 .svg 結尾 以 image/svg+xml 串流原檔
3 o=1 依副檔名推斷 MIME(GetMimeType)並串流原檔
4 本地快取檔存在 依 t 設定 Content-Type 並串流快取檔
5 其他 進入 libvips 轉檔

所有分支都先設定 7 天的 Cache-Control 與 Expires。

轉檔步驟

轉檔在 goroutine 內執行,受 30 秒逾時限制:

步驟 呼叫 說明
1 os.MkdirAll 建立快取檔所在目錄
2 os.ReadFile → vips.NewImageFromBuffer 讀原檔並解碼
3 GetNewSize → Resize(scale, KernelLanczos3) 尺寸不同時以 Lanczos3 等比例縮放(規則見 尺寸計算)
4 GaussianBlur(GetBlur(b)) 高斯模糊,sigma 限制於 0–100
5 Linear([B], [0]) 亮度:各通道乘以 B;B 非數字時轉檔失敗
6 ExportJpeg/ExportPng/ExportAvif/ExportWebp 依 t 匯出;PNG 不套用品質
7 os.WriteFile 寫入本地快取檔

任一步驟失敗都改回 404 佔位 SVG(d=1 或 d=dark 為深色版),並帶 Cache-Control: no-cache。

串流輸出

streamImage(記憶體內 buffer)與 streamFile(原檔)皆以 Transfer-Encoding: chunked 輸出,每累積一個 buffer 就 Flush 一次:

檔案大小 buffer
≤ 50 KiB 2 KiB
≤ 500 KiB 4 KiB
≤ 2 MiB 8 KiB
其他 16 KiB

streamFile 另外送出 Content-Length;ResponseWriter 不支援 http.Flusher 時改用 c.File 一次輸出。

EN