데이터스토리지
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을 이용해 브라우저가 직접 업로드하도록 구성하세요.