用 cloudflare 的 R2 和 worker 来做文件托管

感觉 cloudflare 真的屌,以前可以用 worker 的反向代理功能来科学上网,现在出了个 R2 文件托管,但是只能私有访问,那是不是可以用 worker 反代 R2 来做一个博客网盘或者图床呢。

建立一个 R2 桶

打开 cloudflare 的控制面板的 R2 并且建立一个桶

新建一个 worker

代码如下,我只开放了 GET 方法,当然官方文档有详细的介绍
注意第4行加了一个 decodeURI 不然中文文件名会找不到

export default {
  async fetch(request, env) {
    const url = new URL(request.url);
    const key = decodeURI(url.pathname.slice(1));
    console.log(key)
    switch (request.method) {
      case 'GET':
        const object = await env.R2.get(key);

        if (!object || !object.body) {
          return new Response('Object Not Found', { status: 404 });
        }

        const headers = new Headers();
        object.writeHttpMetadata(headers);
        headers.set('etag', object.httpEtag);

        return new Response(object.body, {
          headers,
        });
      default:
        return new Response('Method Not Allowed', {
          status: 405,
          headers: {
            Allow: 'GET',
          },
        });
    }
  },
};

绑定 R2 到 worker 上

注意环境变量名要和脚本的变量名一致
Screenshot_20220616_065342

绑定自定义域名

现在已经可以直接通过 worker 的 url 进行下载了,但是也可以绑定一个自定义的域名

  1. 在 cloudflare 上关联域名
  2. 在域名的 dns 解析设置一个子域名,目标随便设置,但是要打开代理模式
  3. 在域名的 Workers 上设置 HTTP ROUTER, url 为 xxx.domain.com/*, worker 选择刚刚新建的worker

然后就大功告成,可以测试一下,上传个文件test.zip到 R2 上,然后浏览器打开 https://xxx.domain.com/test.zip 应该就可以下载了

参考