用 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 上
注意环境变量名要和脚本的变量名一致
绑定自定义域名
现在已经可以直接通过 worker 的 url 进行下载了,但是也可以绑定一个自定义的域名
- 在 cloudflare 上关联域名
- 在域名的 dns 解析设置一个子域名,目标随便设置,但是要打开代理模式
- 在域名的 Workers 上设置 HTTP ROUTER, url 为
xxx.domain.com/*
, worker 选择刚刚新建的worker
然后就大功告成,可以测试一下,上传个文件test.zip
到 R2 上,然后浏览器打开 https://xxx.domain.com/test.zip
应该就可以下载了