wrangler kv bulk put 二進位資料損壞?先升級 4.125.0
如果你用 wrangler kv bulk put 批次上傳圖片、壓縮檔或其他二進位內容,先確認 Wrangler 版本與儲存位置。Wrangler 4.125.0 修正了一個本機 KV 問題:JSON 項目標記 base64: true,且解碼後包含無法組成有效 UTF-8 的位元組時,舊版可能把值以錯誤的內容寫入 local KV。
這個修正有清楚的邊界:官方 release note 指出,受影響的是本機 kv bulk put;remote 寫入、沒有 base64 的項目,以及 kv key put 都不在這個問題範圍內。升級到 4.125.0 或更新版本後,仍要重新寫入已經損壞的本機資料;工具更新不會自動修復舊值。
先分清 local 與 remote
Wrangler v4 的 KV 命令預設使用本機資料。需要操作 Cloudflare API 或正式 namespace 時,必須明確加上 --remote;只寫一個沒有旗標的命令,不能當成「一定會更新雲端」。
| 目的 | 建議寫法 | 寫入位置 |
|---|---|---|
本機 wrangler dev 測試 | wrangler kv bulk put fixture.json --binding=MY_KV --local | local KV |
| 寫入 Cloudflare namespace | wrangler kv bulk put fixture.json --binding=MY_KV --remote | remote KV |
| 單筆本機二進位資料 | wrangler kv key put fixture.bin --path=./fixture.bin --binding=MY_KV --local | local KV |
--binding=MY_KV 要換成 wrangler.toml 或 wrangler.jsonc 中的 KV binding 名稱;如果沒有 binding,也可以依官方命令使用 --namespace-id。不論使用哪一種方式,都把 --local 或 --remote 寫進腳本,避免日後升級 Wrangler 後因預設值誤解而寫錯地方。
如何確認自己真的遇到這個問題
先看專案實際執行的 Wrangler,而不是只看全域安裝版本:
pnpm exec wrangler --version建立一個只供測試的二進位 fixture。以下 Node.js 腳本會把檔案轉成 base64,產生 kv bulk put 需要的 JSON;不要把正式資料直接拿來做第一次驗證:
node - <<'NODE'const fs = require('node:fs');const value = fs.readFileSync('fixture.bin').toString('base64');fs.writeFileSync( 'fixture.json', JSON.stringify([{ key: 'fixture.bin', value, base64: true }], null, 2),);NODE在受測版本上寫入 local KV:
pnpm exec wrangler kv bulk put fixture.json --binding=MY_KV --local接著由 wrangler dev 中的 Worker 以 arrayBuffer 讀回 fixture.bin,比較寫入前後的長度與 SHA-256。不要用 --text 讀二進位值,因為該旗標會把結果解碼為 UTF-8 字串;即使檔案原本不是文字,驗證程式也可能因此掩蓋問題。
若想用 CLI 確認資料流程,kv bulk get 可以輸出批次結果,或先用 kv key get 列出該 key;真正的判斷仍應以 Worker 讀回的 ArrayBuffer bytes 為準。測試 namespace、--persist-to 位置和 fixture.bin 都應該是可拋棄的資料。
正確修復流程
1. 將 Wrangler 固定在已修正版本
專案使用 pnpm 時,將 Wrangler 放在專案的 devDependencies,再重新產生 lockfile:
pnpm add --save-dev wrangler@^4.125.0pnpm exec wrangler --version如果專案已經有版本範圍,至少確認 lockfile 實際解析到 4.125.0 以上;CI 和本機都使用 pnpm exec wrangler,不要讓全域舊版混進測試。
2. 重跑 local binary fixture
升級後清理或換一個 local persistence 目錄,重新執行 kv bulk put,再由 Worker 讀回並比對 bytes。清掉舊 local KV 只能移除測試資料,不會修復資料本身;如果這些資料是要保留的,請從原始檔案重新產生 JSON 後再寫入。
3. 需要正式資料時明確指定 --remote
把批次寫入正式 namespace 的流程寫成:
pnpm exec wrangler kv bulk put fixture.json --binding=MY_KV --remote執行前確認帳號、環境和 namespace ID。--remote 代表會呼叫 Cloudflare API,不能在沒有 review 或備份的情況下直接套到 production script;若只想測試序列化結果,保留 --local。
不要把三種問題混在一起
- 讀回 bytes 變長或內容不同:先看是不是舊版 Wrangler、
base64: true、local KV,以及內容是否包含無效 UTF-8 位元組。 - 寫入了錯的 namespace:先檢查 Wrangler v4 的 local 預設和是否漏了
--remote,這不是同一個 binary corruption bug。 - 只有文字值失敗:沒有
base64或內容是有效 UTF-8 時,官方 4.125.0 release note 描述的案例不一定適用,應另外檢查 binding、JSON 格式和權限。
這樣分層後,才不會為了修 local fixture 而誤改正式 KV,也不會把遠端 API 的權限錯誤誤判成二進位編碼問題。
常見問題
Q: base64: true 是不是代表 Wrangler 會把資料當成文字?
A: 不是。它表示 JSON 中的 value 以 Base64 表示,寫入 KV 時應還原成原始 bytes。這也是為什麼圖片、壓縮檔和其他非 UTF-8 內容需要用它;不要先把二進位檔轉成一般文字再上傳。
Q: 已經使用 Wrangler 4.125.0,還需要把遠端資料全部重寫嗎?
A: 官方修正針對 local KV。release note 說明 remote writes 沒有受到這個問題影響;先確認你的寫入確實使用 --remote,再依實際 checksum 和資料來源決定是否需要回補,不要因為升級版本就無差別重寫 production namespace。
Q: 單筆 kv key put --path 可以當成替代方案嗎?
A: 對單一檔案可以。官方 release note 將 kv key put 列為不受此問題影響的路徑,但批次流程仍建議升級 Wrangler,並明確標示 --local 或 --remote。
參考資料:
Wrangler 4.125.0 release notes:修正 local KV binary values
回報錯字、失效連結,或告訴我你想看的延伸主題。