--- name: r2-upload description: Upload files to Cloudflare R2 via S3-compatible API. Standalone skill and importable package. --- # R2 Upload Upload files to Cloudflare R2. Works as a CLI skill and as an importable package for other skills. ## CLI Usage ```bash bun run upload -- --file=/tmp/report.pdf --key=reports/2024/report.pdf bun run upload -- --file=/tmp/data.json bun run upload -- --file=/tmp/image.png --content-type=image/png --dry-run ``` ## As Package Dependency Other skills can import this package: ```json { "dependencies": { "@clawd/r2-upload": "file:../r2-upload" } } ``` ```ts import { loadR2Config, uploadToR2, uploadFile } from "@clawd/r2-upload"; const config = loadR2Config(); const url = await uploadToR2(config, "my/key.txt", "content", "text/plain"); const result = await uploadFile(config, "/tmp/file.pdf", "docs/file.pdf"); ``` ## Config All R2 config is loaded from `.env.local`: ``` CLOUDFLARE_ACCESS_KEY_ID=xxx CLOUDFLARE_SECRET_ACCESS_KEY=xxx CLOUDFLARE_ENDPOINT=https://xxx.r2.cloudflarestorage.com CLOUDFLARE_BUCKET_NAME=common-static CLOUDFLARE_PUBLIC_URL=https://static.example.com ``` ## CLI Flags - `--file` (required) local file path to upload - `--key` R2 object key (default: `uploads//`) - `--content-type` MIME type (default: auto-detected from extension) - `--dry-run` validate without uploading ## Output ```json { "status": "success", "key": "reports/2024/report.pdf", "url": "https://static.example.com/reports/2024/report.pdf", "size": 12345, "contentType": "application/pdf" } ```