简介:本文详细介绍如何利用Cloudflare R2对象存储的免费额度搭建零成本图床,涵盖技术原理、配置步骤、安全优化及成本分析,为开发者提供可落地的解决方案。
在传统图床方案中,开发者常面临存储成本高、带宽限制、跨区域访问慢等问题。AWS S3等云存储虽成熟,但即使使用免费层,超出部分仍会产生费用。而Cloudflare R2对象存储的差异化优势在于:
以一个日均1000次访问、单图500KB的小型博客为例,每月存储消耗约1.5GB(远低于免费额度),出站流量约15GB(若用S3需支付$1.5,而R2免费)。
my-images.r2.dev)。
// workers/r2-auth.js 示例:生成带签名的访问URLexport async function handleRequest(request) {const bucket = env.MY_BUCKET;const key = 'path/to/image.jpg';// 生成预签名URL(有效期1小时)const url = new URL(bucket.getSignedURL({method: 'GET',path: key,expires: 3600}));return Response.redirect(url.toString(), 302);}
关键配置项:
https://yourdomain.com)和HTTP方法(GET/PUT)。Cache-Control: max-age=86400提升重复访问性能。
curl -X PUT "https://api.cloudflare.com/client/v4/accounts/<ACCOUNT_ID>/storage/r2/buckets/<BUCKET_NAME>/uploads" \-H "Authorization: Bearer <API_TOKEN>" \-F "key=test.jpg" \-F "file=@/path/to/local.jpg"
Web端上传:使用@upstash/r2库实现浏览器直传:
import { R2Client } from '@upstash/r2';const r2 = new R2Client({accountId: 'your_account_id',apiToken: 'your_api_token',bucket: 'your_bucket'});async function uploadFile(file) {await r2.put(file.name, file);return `https://${bucket}.r2.dev/${file.name}`;}
https://image.r2.dev/photo.jpg?width=200&height=200&fit=cover
Accept: image/webp自动触发格式转换。Referer头:
async function handleRequest(request) {const referer = request.headers.get('Referer');if (!referer?.includes('yourdomain.com')) {return new Response('Forbidden', { status: 403 });}// ...正常返回图片}
| 指标 | Cloudflare R2 | AWS S3标准 | 腾讯云COS |
|---|---|---|---|
| 存储费(GB/月) | $0(前10GB) | $0.023 | $0.13 |
| 出站流量费 | $0 | $0.09/GB | $0.5/GB |
| 免费额度 | 10GB存储 | 5GB存储 | 6GB存储 |
长期使用建议:
R2:Write。curl -I查看cf-cache-status头)。*或指定域名(生产环境建议限制)。通过本文方案,开发者可快速搭建一个零成本的图床系统,既适合个人博客的图片托管,也可作为小型项目的静态资源存储方案。实际测试显示,1000张图片的存储+访问成本可控制在$0.15/月以内,相比传统方案节省超过90%的费用。