運作方式
你的檔案由你正在用的瀏覽器打開,從來不會被送去任何地方。
以下是實際跑的東西,按執行順序排列,還有一分鐘之內自己驗證的方法。
檔案是被讀取,不是被上傳
放入檔案時,頁面拿到的是一個 File 物件,用 File API 在這個分頁裡讀進記憶體。沒有任何請求帶著它走,因為根本沒有地方可以去:這個網站只是 CDN 上的靜態檔案,沒有伺服器程式可以接收東西。
- File 與 Blob 承載位元組,FileReader 與 arrayBuffer 負責讀取
- 拖放、選檔、貼上,交出來的都是同一個物件
- 只要有頁面出現 fetch、上傳、form action 或 API 路徑,建置就會失敗
解碼在分頁裡發生
相機和設計軟體寫出的格式,瀏覽器自己打不開,所以解碼器隨頁面一起送到,就在旁邊執行。
- HEIC 與 HEIF:libheif 的 JavaScript 版本,由本站自己提供
- PDF:PDF.js,其中部分影像編解碼會用到 WebAssembly
- SVG 描摹用 ImageTracer;讀 QR 用 jsQR;寫 PDF 用 pdf-lib
- 每一個函式庫都在建置時下載並由本網域提供,所以沒有第三方 CDN 看得見你的造訪
處理跑在 canvas,而且在 worker 裡
縮放、壓縮、轉檔都是 canvas 運算。它們在 Web Worker 內執行,所以大張相片不會讓你眼前的頁面卡住。
- worker 裡的 OffscreenCanvas 負責繪製與重新編碼每一張圖
- convertToBlob 產生 JPG、PNG 或 WebP,品質由你決定
- PNG 壓縮用的是為本站自己寫的 median cut 調色盤,不是外來函式庫
- 檔案的任何資訊 —— 名稱、大小、內容或由它們推導出來的東西 —— 一律不量度、不回報
結果也是在這裡造出來的
你下載的東西,是在這個分頁組好的 Blob,再以 object URL 交給瀏覽器。它從來沒有在別的地方存在過。
- 一次一個檔案,或在分頁裡打包成 ZIP
- 關掉分頁結果就消失;沒有任何東西被存起來等你回來拿
自己驗證
不要只信這一頁。兩個方法,都不用一分鐘。
- 開 DevTools 的 Network 分頁,然後轉一個檔案。不會有任何帶著你檔案的請求離開。
- 載入頁面後把網路關掉,再用那個工具。它照樣運作。
- 看原始碼:這裡跑的每一樣東西都是你可以直接打開來看的檔案。
裝置端與上傳式工具並排比較
兩種工具都存在,也都正當。分別在於你的檔案去了哪裡,而這個分別決定了你要相信什麼。
| 在你的裝置上 | 上傳到伺服器 | |
|---|---|---|
| 檔案去哪裡 | 留在分頁內 | 傳去伺服器 |
| 保留多久 | 沒有東西需要保留 | 通常在設定的時限後刪除 |
| 可否離線用 | 頁面載入後可以 | 不可以 |
| 檔案大小上限 | 你裝置的記憶體 | 服務容許的上限 |
| 你要相信什麼 | 頁面做了什麼,而你看得到 | 服務聲稱自己做了什麼 |
每一個工具,同一套規矩
全部都是這樣運作。這裡沒有付費版、沒有帳戶,也沒有會離開的檔案。