runlot
데이터스토리지

put, get, list

파일을 업로드하고, 내려받고, 목록을 조회하는 방법을 안내합니다.

업로드

app.post("/upload", async (c) => {
  const form = await c.req.formData();
  const file = form.get("file") as File;
  const obj = await c.env.storage.put(`covers/${file.name}`, file, {
    contentType: file.type,
  });
  return Response.json({ key: obj.key, size: obj.size, etag: obj.etag });
});

body에는 Response 또는 Request 본문에 사용할 수 있는 값을 전달할 수 있습니다. File, Blob, ArrayBuffer, ReadableStream, 문자열을 지원합니다.

contentType을 지정하지 않으면 기본값을 사용합니다. 브라우저가 파일을 올바르게 처리해야 한다면 명시적으로 지정하세요.

다운로드

const obj = await env.storage.get(key);
if (!obj) return new Response("파일을 찾을 수 없습니다", { status: 404 });

return new Response(obj.body, {
  headers: {
    "content-type": obj.contentType,
    "content-length": String(obj.size),
    etag: obj.etag,
  },
});

body는 스트림입니다. 파일 전체를 메모리에 올리지 않고 응답으로 전달할 수 있습니다.

메타데이터만 필요하다면 head를 사용하세요.

const meta = await env.storage.head(key);
if (meta && meta.etag === request.headers.get("if-none-match")) {
  return new Response(null, { status: 304 });
}

삭제

await env.storage.delete(key);

목록 조회

let cursor = "";
do {
  const page = await env.storage.list({ prefix: "covers/", cursor, limit: 100 });
  for (const obj of page.objects) {
    console.log(obj.key, obj.size);
  }
  cursor = page.cursor;
} while (cursor !== "");

cursor가 빈 문자열이면 마지막 페이지입니다. limit의 기본값은 100개, 최댓값은 1,000개입니다.

prefix는 디렉터리가 아니라 문자열 접두사입니다. 예를 들어 covers/를 지정하면 이 문자열로 시작하는 모든 키를 반환합니다.

큰 파일은 브라우저가 직접 업로드하게 하세요

워커를 통해 업로드하면 요청 처리 시간과 메모리를 사용합니다. 큰 파일은 서명 URL을 이용해 브라우저가 직접 업로드하도록 구성하세요.

이 페이지의 목차