runlot

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 を返します

gethead は、キーが存在しない場合に 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); // TypeError

URL パーサーが /o/../x/x に正規化したあとでは、元のパスを検査できません。そのため、ワーカーがリクエストを送る前にこうしたキーを拒否します。

キー全体の長さは最大 1024 バイトです。

プロジェクト間のファイル分離

ストレージキーにはプロジェクト識別子が自動的に追加されます。他のプロジェクトのオブジェクトをキーで指定することはできません。

このページの目次