零成本撸图床:用Cloudflare Workers搞定个人公开相册

大家好,最近很多朋友在后台私信问,有没有那种不需要服务器、不仅免费而且速度还快的图床推荐?毕竟现在的图床服务,要么收费越来越贵,要么容易跑路,自己搭一个又嫌VPS麻烦。

其实,只要利用好Cloudflare(简称CF)这棵大树,我们完全可以白嫖出一个稳定性极佳的个人公开图床。核心思路就是用Workers做业务逻辑,用R2做对象存储。

今天就把这套“零成本”方案毫无保留地分享出来,不仅不用花一分钱,而且搭建过程比你想象的还要简单。

为什么选择这套方案?

在开始动手之前,我们先聊聊为什么推荐这个组合,尤其是对于那些不想折腾服务器运维的同学:

  1. 真正的零成本:Cloudflare的Workers和R2都有非常慷慨的免费额度。对于个人博客或者给朋友分享图片的量来说,基本不可能用完。按照目前的官方政策,每天有10万次请求的免费配额,存储空间也足够日常生活使用。
  2. 无需维护服务器:你不需要去购买VPS,不需要配置LNMP环境,也不需要担心系统被黑或者镜像被挂马。所有的计算和存储都依托于Cloudflare的全球边缘网络,高可用性由他们保证。
  3. 访问速度极快:Cloudflare的CDN节点遍布全球,你上传的图片会被分发到离访问者最近的节点。无论是你在国内的朋友还是国外的读者,打开图片的速度都会非常快。
  4. 自定义域名:虽然CF提供免费的.workers.dev域名,但如果你有自己的域名,绑定上去后访问会更稳定,看起来也更专业。

准备工作:你需要什么?

废话不多说,直接上干货。开始之前,你需要准备以下两样东西:

  • 一个Cloudflare账号(如果没有,去注册一个,全过程免费)。
  • 一个域名(可选,推荐准备一个,如果你只是内部测试不想花钱,用CF提供的默认域名也可以)。

第一步:开通并配置 R2 存储桶

R2是Cloudflare推出的对象存储服务,兼容S3的API,这就是我们存放图片的“仓库”。

  1. 登录Cloudflare控制台,在左侧侧边栏找到 R2(有时候可能在“更多”里面)。
  2. 点击“创建存储桶”。
  3. 命名:给你的图床起个名字,比如my-public-images。注意这个名字全球唯一,如果被人占用了就换一个。
  4. 区域设置:通常推荐不设置特定区域,这样全球访问速度最佳。
  5. 在创建完成后,进入该存储桶的 Settings -> Public Access,开启“Allow Access”。这一步很关键,否则图片只能你自己看,别人无法通过链接访问。安全提示:开启公开访问意味着只要是链接谁都能看,请勿上传隐私照片!

第二步:获取 API Token

为了让Workers有权限往R2里存文件,我们需要创建一个API令牌。

  1. 在右侧侧边栏找到 Manage R2 API Tokens
  2. 点击“Create API Token”。
  3. 权限设置为 Object Read & Write(读写权限)。
  4. TTL(有效期)可以设置得久一点,比如“Forever”,这样省得以后老得更新。
  5. 创建完成后,系统会给你一个 Access Key IDSecret Access Key务必立刻复制保存下来,这个Secret Key只显示一次!

第三步:编写 Worker 代码

这是最核心的一步。Worker相当于我们的“后端程序”,负责接收上传请求并把文件塞进R2。

  1. 回到Cloudflare首页,点击 Workers & Pages
  2. 点击“创建应用程序”,选择“创建Worker”。
  3. 给Worker起个名字(比如img-bed-proxy),点击“部署”。
  4. 部署完成后,点击“编辑代码”。

这里我们需要写一段简单的JS代码。为了方便大家使用,这里提供一套通用的代码逻辑:

  • 监听 POST 请求,接收 multipart/form-data 格式的图片文件。
  • 验证文件类型,防止乱传文件。
  • 将文件写入 R2 存储桶。
  • 返回文件的公开访问URL。
export default {
  async fetch(request, env) {
    if (request.method === "OPTIONS") {
      // 处理跨域预检请求
      return handleOptions(request);
    }

    // 仅允许 POST 上传
    if (request.method !== "POST") {
      return new Response("Method not allowed", { status: 405 });
    }

    try {
      const formData = await request.formData();
      const file = formData.get('file');

      if (!file) {
        return new Response(JSON.stringify({ error: "No file uploaded" }), { status: 400 });
      }

      // 生成唯一文件名
      const ext = file.name.split('.').pop();
      const timestamp = Date.now();
      const randomStr = Math.random().toString(36).substring(2, 8);
      const filename = `${timestamp}-${randomStr}.${ext}`;

      // 上传到 R2
      await env.MY_BUCKET.put(filename, file);

      // 构造公开访问链接 (替换为你的域名)
      const url = `https://img.yourdomain.com/${filename}`;

      return new Response(JSON.stringify({ url: url }), {
        headers: { "Content-Type": "application/json" },
      });
    } catch (e) {
      return new Response(JSON.stringify({ error: e.message }), { status: 500 });
    }
  }
};

// CORS 处理函数
function handleOptions(request) {
  // ... 具体的CORS header设置可以参考官方文档,这里建议允许所有源以方便测试
  return new Response(null, {
    status: 204,
    headers: {
      "Access-Control-Allow-Origin": "*",
      "Access-Control-Allow-Methods": "GET, HEAD, POST, OPTIONS",
    },
  });
}

注意:代码中的 MY_BUCKET 需要我们在下一步绑定变量,img.yourdomain.com 需要替换成你实际的访问域名。

第四步:绑定 R2 和 域名

代码写好了,还需要把环境和Worker连起来。

  1. 在Worker编辑页面,点击左侧的 Settings -> Variables
  2. R2 Bucket Bindings 部分,点击“Add binding”。
  3. Variable name 填写代码里用到的 MY_BUCKET
  4. R2 Bucket 在下拉菜单里选择我们在第一步创建的存储桶。
  5. 保存并部署。

接下来绑定域名(推荐):

  1. 在Worker的 Triggers -> Custom Domains 中点击“Add domain”。
  2. 输入你想要用的二级域名,比如 img.example.com
  3. 按照提示添加DNS记录即可。

进阶玩法:配合前端工具使用

虽然现在你可以直接用 curl 命令上传图片,但那样太极客了。为了方便给朋友分享,你可以把这个Worker接口对接到简单的HTML页面,或者使用第三方开源的图床上传工具。

现在市面上很多开源的PicGo等工具都支持WebAPI配置。你只需要把刚才Worker的URL填进去,设置好请求参数(通常是名为file的表单字段),就可以实现“点击上传,自动复制外链”的丝滑体验了。

避坑指南 & 常见问题

在折腾过程中,我也踩过几个坑,这里提前帮大家排雷:

  • 大小限制:Cloudflare Workers对请求体大小有限制(通常是100MB以内,免费版更小),如果你要传几十兆的高清大图,直接通过Worker传可能会报错。这种情况下,可以考虑官方的Presigned URL方案,或者干脆把图片压缩一下再传。
  • 文件名中文问题:为了兼容性,建议代码里强制重命名为时间戳+随机字符串,避免用中文文件名,否则在某些老旧浏览器或环境中下载图片时会出现乱码。
  • 防盗链:目前我们设置的是完全公开。如果担心流量被盗刷,可以在Worker代码里做个简单的 Referer 检查,只允许你自己的域名或者空Referer访问,这样能省去不少不必要的麻烦。

总结

这套Cloudflare Workers + R2的方案,是目前个人用户搭建图床的性价比之选。它不仅省去了每年的续费烦恼,而且依托Cloudflare的大厂背书,稳定性远超那些廉价的VPS图床。

虽然搭建过程需要写几行代码,但相比于长期省下的费用和精力,绝对是物超所值的。赶紧动手试试吧,拥有一个专属的、永久的图床,就在眼前!

标签: none

AI Skills Smart Station on Nick Launches

评论已关闭