[ PROMPT_NODE_24248 ]
R2 API 参考
[ SKILL_DOCUMENTATION ]
# R2 API 参考
## PUT (上传)
typescript
// 基础
await env.MY_BUCKET.put(key, value);
// 带元数据
await env.MY_BUCKET.put(key, value, {
httpMetadata: {
contentType: 'image/jpeg',
contentDisposition: 'attachment; filename="photo.jpg"',
cacheControl: 'max-age=3600'
},
customMetadata: { userId: '123', version: '2' },
storageClass: 'Standard', // 或 'InfrequentAccess'
sha256: arrayBufferOrHex, // 完整性校验
ssecKey: arrayBuffer32bytes // SSE-C 加密
});
// 值类型: ReadableStream | ArrayBuffer | string | Blob
## GET (下载)
typescript
const object = await env.MY_BUCKET.get(key);
if (!object) return new Response('Not found', { status: 404 });
// Body: arrayBuffer(), text(), json(), blob(), body (ReadableStream)
// 范围读取
const object = await env.MY_BUCKET.get(key, { range: { offset: 0, length: 1024 } });
// 条件 GET
const object = await env.MY_BUCKET.get(key, { onlyIf: { etagMatches: '"abc123"' } });
## HEAD (仅元数据)
typescript
const object = await env.MY_BUCKET.head(key); // 返回不带 body 的 R2Object
## DELETE
typescript
await env.MY_BUCKET.delete(key);
await env.MY_BUCKET.delete([key1, key2, key3]); // 批量 (最大 1000)
## LIST
typescript
const listed = await env.MY_BUCKET.list({
limit: 1000,
prefix: 'photos/',
cursor: cursorFromPrevious,
delimiter: '/',
include: ['httpMetadata', 'customMetadata']
});
// 分页 (始终使用 truncated 标志)
while (listed.truncated) {
const next = await env.MY_BUCKET.list({ cursor: listed.cursor });
listed.objects.push(...next.objects);
listed.truncated = next.truncated;
listed.cursor = next.cursor;
}
## 分段上传 (Multipart Uploads)
typescript
const multipart = await env.MY_BUCKET.createMultipartUpload(key, {
httpMetadata: { contentType: 'video/mp4' }
});
const uploadedParts: R2UploadedPart[] = [];
for (let i = 0; i < partCount; i++) {
const part = await multipart.uploadPart(i + 1, partData);
uploadedParts.push(part);
}
const object = await multipart.complete(uploadedParts);
// 或: await multipart.abort();
// 恢复
const multipart = env.MY_BUCKET.resumeMultipartUpload(key, uploadId);
## 预签名 URL (S3 SDK)
typescript
import { S3Client, PutObjectCommand } from '@aws-sdk/client-s3';
import { getSignedUrl } from '@aws-sdk/s3-request-presigner';
const s3 = new S3Client({
region: 'auto',
endpoint: `https://${accountId}.r2.cloudflarestorage.com`,
credentials: { acces