CAKE20

AI Web PaaS

공개 파일

storage 함수는 웹사이트 루트 files 안의 공개 파일을 관리합니다.

웹페이지에서 호출

files/images/aaaa.jpg 파일은 같은 웹사이트의 /files/images/aaaa.jpg 주소로 공개됩니다.

Cake20 View에서는 /files/로 시작하는 상대 URL을 그대로 사용할 수 있습니다. 서버 코드에서 URL을 만들 때는 Object Storage 설정도 지원하는 storage.url()을 사용합니다.

// app/pages/index.tsx
export default () => (
  <img src="/files/images/aaaa.jpg" alt="업로드 이미지" />
);

// server/api/image.get.ts
export default () => ({
  src: storage.url("images/aaaa.jpg")
});

사용 원칙

  • files 안의 상대 경로는 같은 /files/ URL로 브라우저에 공개됩니다.
  • 업로드와 런타임 생성 파일은 루트 files에만 저장할 수 있습니다.
  • 웹사이트 코드에서는 직접 파일 경로를 만들지 않고 storage를 사용합니다.
  • 웹사이트 프로세스의 영구 쓰기 권한은 files에만 있으며 tmp는 임시 파일에만 사용합니다.
  • 업로드 파일은 실행 권한 없이 저장되고, Ubuntu 운영 웹사이트에서는 shell과 외부 시스템 명령을 실행할 수 없습니다.
  • 한 번의 업로드 요청은 웹사이트 설정의 업로드·요청 용량 제한을 적용하며 기본값은 10MB입니다.
  • 웹사이트 전체 사용자 파일은 관리자 기본 제한을 적용하며 기본값은 100MB입니다.
  • 비밀번호, 인증 정보와 비공개 문서는 files에 저장하지 않습니다.
  • 사용자 파일 용량은 build, backup, tmp와 .git을 제외하고 관리자 설정 한도 내에서 관리됩니다.
  • 파일 경로에는 웹사이트 루트 밖으로 나가는 값이나 심볼릭 링크를 사용할 수 없습니다.
  • files는 에디터·MCP·빌드 release·ZIP 가져오기와 내보내기에서 제외됩니다.
  • /files/경로는 현재 release가 아닌 웹사이트 루트 files에서만 응답합니다.
  • files는 자동 백업하지 않으므로 필요한 파일은 외부 저장소에도 보관합니다.
await storage.put("avatars/1.webp", image);
const data = await storage.get("avatars/1.webp");
const files = await storage.list("avatars/");
const url = storage.url("avatars/1.webp"); // /files/avatars/1.webp
await storage.remove("avatars/1.webp");

STORAGE_ENDPOINT, STORAGE_BUCKET, STORAGE_ACCESS_KEY와 STORAGE_SECRET_KEY를 설정하면 같은 API가 S3 호환 Object Storage를 사용합니다. 설정이 없으면 루트 files를 사용합니다.