画像扱う系のことがしたくて、Cloudflare R2に入門してみた(*´ω`*)
R2はS3互換のため、aws-sdk-js-v3
を使って操作するらしい
流れ
だいたいこんな感じ
- Cloudflare R2のバケットを作成
- バケットにドメインを接続
- R2へのアクセスキーを生成
- R2 API Tokens | Cloudflare
- Authentication · Cloudflare R2 docs
- 権限とか対象バケットとかもして挺できる
aws-sdk-js-v3
を使って書き込み
インストール
まずはインストール
pnpm add @aws-sdk/client-s3
使い方
使い方はこんな感じ
import { HeadObjectCommand, PutObjectCommand, S3Client, } from "@aws-sdk/client-s3"; const R2_ENDPOINT = "https://XXXXXXX.r2.cloudflarestorage.com"; const R2_ACCESS_KEY_ID = "..."; const R2_SERCRET_ACCESS_KEY = "..."; const R2_BUCKET_NAME = "my-bucket-name"; // S3クライアントの初期化 const s3Client = new S3Client({ region: "auto", endpoint: R2_ENDPOINT, credentials: { accessKeyId: R2_ACCESS_KEY_ID, secretAccessKey: R2_SERCRET_ACCESS_KEY, }, }); // 書き込み export async function writePngFileR2(body: Buffer, path: string) { await s3Client.send(new PutObjectCommand({ Bucket: R2_BUCKET_NAME, Key: path, Body:body, // 指定しないと、全部application/octet-streamになる。。 ContentType: "image/png", })); } // Headを使って存在確認 export async function existsFileR2(path: string): Promise<boolean> { try { await s3Client.send(new HeadObjectCommand({ Bucket: R2_BUCKET_NAME, Key: path, })); return true; } catch (error: any) { // 存在しない場合、NoSuchKeyが投げられる return error?.name === "NoSuchKey"; } }
あとは、接続したドメイン+パスでアクセスできる。
S3 APIでの各種操作
XxxCommand
を使って操作するっぽい。
PutObjectCommand
: ファイルの書き込みHeadObjectCommand
: メタ情報の取得GetObjectCommand
: ファイルの取得DeleteObjectCommand
: ファイルの削除- などなど
S3のすべてに互換性があるわけではなく、
対応状況は以下にまとまってる。
Content Type
PutObjectCommand
時に、ContentTypeを指定しないと、
全部application/octet-streamになる。。
対応関係はこんな感じ
"png" : "image/png", "jpeg": "image/jpeg", "gif" : "image/gif", "webp": "image/webp", "svg" : "image/svg+xml",
以上!! 意外と簡単に使えた(*´ω`*)