데이터스토리지
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 입니다
get 과 head 는 없는 키에 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); // TypeErrorURL 파서가 /o/../x 를 /x 로 접은 뒤에는 검사할 방법이 없기 때문에, 워커 안에서 요청을 보내기 전에 막습니다.
키 전체 길이는 1024 바이트까지입니다.
다른 프로젝트와 섞이지 않습니다
키에는 프로젝트 접두가 자동으로 붙습니다. 다른 프로젝트의 객체를 키로 지목할 방법이 없습니다.