runlot
데이터스토리지

env.storage

put · get · head · delete · list · presign 여섯입니다.

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 을 돌려줍니다. 404 를 예외로 만들지 않는 이유는, "없는지 확인하는 것" 이 흔한 일이라 그때마다 try/catch 를 쓰게 하고 싶지 않아서입니다.

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 바이트까지입니다.

다른 프로젝트와 섞이지 않습니다

키에는 프로젝트 접두가 자동으로 붙습니다. 다른 프로젝트의 객체를 키로 지목할 방법이 없습니다.

이 페이지에서