Cloudflare 免费图床搭建教程:R2 + Workers 自建图床,直链随便用

先给个实证:这篇文章里的 3 张图,就存在我刚搭好的这个图床上,地址是 img.abaibl.com。用的是 Cloudflare 的 R2 存储 + Workers,全程免费,这篇把搭建过程完整写下来,照着做十几分钟就能有一个自己的图床。
为什么要自建图床
写博客、发帖子都离不开图片,第三方图床的毛病大家基本都踩过:
- 小图床说关就关,图一夜全挂,文章变成一片裂图
- 免费图床限速、防盗链,外链要么慢要么直接 403
- 图片被压缩,清晰度没法保证
自建图床把存储和域名都握在自己手里:桶是你的、域名是你的,平台规则再怎么变也不影响你已经发出去的直链。Cloudflare 这套方案的好处是成本为零、全球 CDN 出图、出站流量不收费。
方案和费用:免费额度足够个人用
- R2 对象存储(存图片的地方):免费额度每月 10GB 存储、100 万次写入、1000 万次读取,出站流量(别人打开你的图)免费
- Workers(处理上传和出图的程序):免费版每天 10 万次请求
- 前提:需要一个托管在 Cloudflare 的域名,用来绑图床的访问地址(比如 img.你的域名.com)
个人博客的图片量离这些额度差着几个数量级,正常用就是 0 元。

搭建四步
- 建 R2 存储桶:Cloudflare 控制台左侧进 R2,创建一个存储桶,名字随意,比如 blog-images
- 建 Worker 并绑定存储桶:进 Workers & Pages,创建 Worker;在它的设置里添加 R2 绑定,变量名填 IMGS,指向刚建的桶
- 设上传密钥并贴代码:在 Worker 设置的「变量和密钥」里加一个 Secret,名字 UPLOAD_KEY,值自己编一个长随机字符串(这是上传的唯一凭证,别泄露);然后把下面的核心代码贴进 Worker 部署
- 绑自定义域名:Worker 设置里的「域和路由」添加自定义域,比如 img.你的域名.com,DNS 在 Cloudflare 里会自动配好,证书也是自动的
Worker 核心代码(精简版,上传接口 + 公开出图):
export default {
async fetch(request, env) {
const url = new URL(request.url);
// 上传:POST /upload,表单带 key + file
if (url.pathname === "/upload" && request.method === "POST") {
const form = await request.formData();
if (form.get("key") !== env.UPLOAD_KEY) {
return new Response("unauthorized", { status: 401 });
}
const file = form.get("file");
if (!file || !file.type.startsWith("image/")) {
return new Response("bad file", { status: 400 });
}
const ext = file.name.split(".").pop().toLowerCase();
const ym = new Date().toISOString().slice(0, 7).replace("-", "");
const key = ym + "/" + Math.random().toString(36).slice(2, 12) + "." + ext;
await env.IMGS.put(key, file.stream(), {
httpMetadata: { contentType: file.type },
});
return Response.json({ url: url.origin + "/" + key, key });
}
// 读图:GET /<key>,带一年强缓存
const obj = await env.IMGS.get(url.pathname.slice(1));
if (!obj) return new Response("not found", { status: 404 });
const headers = new Headers();
obj.writeHttpMetadata(headers);
headers.set("Cache-Control", "public, max-age=31536000, immutable");
return new Response(obj.body, { headers });
},
};再在根路径加一个简易上传页(一个 HTML 表单)就更顺手了,像我这个一样,打开图床首页填密钥、选图、上传,立刻返回直链。
怎么用
- 网页上传:打开图床首页,填上传密钥,选图片,提交后返回 JSON,里面的 url 就是图片直链
- 接口上传:
curl -F "key=你的密钥" -F "[email protected]" https://img.你的域名.com/upload - 贴进文章:Markdown 里
就行,任何平台通用

注意事项
- 上传密钥就是命门:谁有密钥谁就能往你的桶里传图,泄露了立刻换;别把带密钥的截图到处发
- 别拿 workers.dev 默认域名当正式地址:国内访问不稳定,一定要绑自己的域名再用
- 免费额度有上限:个人博客随便用,但别把它当公共图床或网盘跑大流量,超额部分 R2 是按量收费的
- 重要图片本地留一份:桶里是唯一副本时,误删就没了
- 图片注意版权与合规:违规内容会被投诉处理,严重的会封账号
一句话总结:有域名在 Cloudflare 的话,花十几分钟用 R2 + Workers 搭一个自己的图床,免费、直链稳定、出图走全球 CDN,比把图片命运交给别人的免费图床踏实得多。