たとえばウェブフォントの`woff2`とか、独自の圧縮方式を採用してるファイルとか。
そういうのをKVに入れたい場合にどうするかというメモです。
KVにファイルをアップロードする方法
色々やり方があるけど、一番お手軽だと思われるのは、`wrangler`CLIでやる方法。
wrangler kv:key put --binding=MY_KV "my-key" path/to/file --path
次に思いつくのは、RESTのAPIを使う方法。
言ってしまうと`wrangler`も内部的にはこのAPIを叩いてるので、一緒といえば一緒。
curl -X PUT \ "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/storage/kv/namespaces/$KV_NAMESPACE/values/$KEY" \ -H "authorization: Bearer $ACCESS_TOKEN" \ --data-binary "@path/to/file"
RESTのAPIということは、同様のことをNodeからやれる。
const fs = require("fs"); const { fetch } = require("undici"); /** * @param {string} key * @param {string} pathToFile */ const putKvFile = (key, pathToFile) => fetch( `https://api.cloudflare.com/client/v4/accounts/${ACCOUNT_ID}/storage/kv/namespaces/${KV_NAMESPACE}/values/${key}`, { method: "PUT", headers: { "authorization": "Bearer " + ACCESS_TOKEN, }, body: fs.createReadStream(pathToFile), } );
このAPIにはレート制限があって、5分の枠で1200リクエストまでとのこと。
The Cloudflare API sets a maximum of 1,200 requests in a five minute period.
https://api.cloudflare.com/#getting-started-requests
ハマったこと
- `wrangler@beta`ではうまく動かない
- 管理画面のGUIからはアップロードできない
- 管理画面から入力できるのは文字列だけ
- 複数ファイルをまとめてアップロードすることはできない(という結論)
- KVとして、複数のキーバリューの書き込み自体はサポートしてる
- `wrangler kv:bulk`コマンドや、bulkアップロード用のREST APIが存在する
- https://api.cloudflare.com/#workers-kv-namespace-write-multiple-key-value-pairs
- ただし、JSON形式でキーとバリューを記述する必要がある
- `base64: true`というフラグもあるけど、圧縮済のコンテンツだからか使えなかった
アップロードしたいのが単なる文字列であれば、何もハマることはないと思う・・。
おまけ: Workerからレスポンスするとき
const file = await MY_KV.get(key, { type: "arrayBuffer" }); return new Response(file, { headers: { /* ... */ } });
`arrayBuffer`にして取り出すのがポイント。