圖片處理流程

最後更新

本頁說明 GET /c/img/{path} 從收到請求到回應的每個步驟,以及各步驟失敗時的行為。

流程

步驟 行為 實作
1. 解析參數 讀取 s/size、w/width、h/height、q/quality、o/origin、d/dark、t/type;短名優先 GetFromPath.ts
2. 對應原檔 /c/img/ 換成 storage/image/upload/,去掉 query string 同上
3. PDF/SVG 副檔名為 .pdf/.svg 時直接串流原檔並結束 streamFile()
4. 正規化格式 type 不在 jpeg/jpg/png/avif/webp 時改為 webp;jpeg 改為 jpg 同上
5. 組快取路徑 依參數組成快取檔名,見 快取層 同上
6. 原檔模式 o=1 時串流原檔並結束 streamFile()
7. 快取命中 以 readFileSync 讀快取檔,成功即回傳 同上
8. 轉檔 sharp 讀原檔與 metadata,依 尺寸規則 resize(),再依格式編碼 sharp
9. 回應與寫入 先送出回應,再以 writeFileSync 寫入快取檔 同上

編碼設定

格式 sharp 呼叫 品質預設 Content-Type
webp image.webp({ quality }) 75 image/webp
avif image.avif({ quality }) 50 image/avif
jpg image.jpeg({ quality }) 75 image/jpeg
png image.png() 不使用 image/png

品質值經 parseInt 後夾在 0–100。

串流原檔

.pdf、.svg 與 o=1 以 createReadStream(highWaterMark 8 KB)串流,並設 Transfer-Encoding: chunked。o=1 的 Content-Type 依副檔名決定:.jpg/.jpeg → image/jpeg、.png → image/png、.webp → image/webp,其他為 application/octet-stream。讀取失敗時回 404 空內容。

失敗處理

情境 回應
原檔不存在 storage/static/404-light.svg(d=1 時為 404-dark.svg),HTTP 狀態 200
sharp 無法解碼或參數無效(如 w=abc) 同上
回應標頭 Content-Type: image/svg+xml、Cache-Control: no-cache、Expires: -1、Pragma: no-cache

相關頁面

EN