データストレージ
env.storage
put、get、head、delete、list、presign の API を提供します。
export interface Storage {
put(key: string, body: BodyInit | null, opts?: { contentType?: string }): Promise<StorageObject>;
/** キーが存在しない場合は `null` を返します。404 エラーではありません。 */
get(key: string): Promise<(StorageObject & { body: ReadableStream<Uint8Array> | null }) | null>;
head(key: string): Promise<StorageObject | null>;
/** 何度呼び出しても安全です。存在しないキーを削除しても成功します。 */
delete(key: string): Promise<void>;
list(opts?: { prefix?: string; cursor?: string; limit?: number }): Promise<StorageListPage>;
/** 署名付き URL です。GET と PUT のみ対応します。ttl は秒単位(既定 300、最大 3600)です。 */
presign(key: string, opts?: { method?: "GET" | "PUT"; ttl?: number }): Promise<string>;
}オブジェクトメタデータの形式は次のとおりです。
export interface StorageObject {
key: string;
size: number;
etag: string;
contentType: string;
/** RFC 1123 形式で、空の場合もあります。 */
lastModified: string;
}存在しないキーは null を返します
get と head は、キーが存在しない場合に null を返します。存在確認はよく行う操作なので、毎回 try/catch で 404 エラーを処理しなくてよいように設計しています。
delete は何度呼び出しても安全です。存在しないキーを削除しても成功します。
キーの規則
キーは / で区切ったパスの形式で記述します。
await env.storage.put("users/42/avatar.png", body);空のパス区間と .、.. は使用できません。
await env.storage.put("a//b", body); // TypeError
await env.storage.put("a/../b", body); // TypeErrorURL パーサーが /o/../x を /x に正規化したあとでは、元のパスを検査できません。そのため、ワーカーがリクエストを送る前にこうしたキーを拒否します。
キー全体の長さは最大 1024 バイトです。
プロジェクト間のファイル分離
ストレージキーにはプロジェクト識別子が自動的に追加されます。他のプロジェクトのオブジェクトをキーで指定することはできません。