图源由Cloudflare R2托管,通过两个Workers连接R2以展示随机图片,静态页面引用Workers的URL以实现以上界面
R2实际上是一个对象存储。Cloudflare提供10G的免费存储和每月1000万次的免费访问
因为Web界面传输文件较慢且不支持传输大于300MB的文件。这里使用本地部署AList然后连接你的R2存储桶实现高速上传
alist.exe
放入一个空文件夹
4. 在cmd中输入alist.exe server
并且不要关闭窗口,运行成功后如图
5. 打开浏览器,输入localhost:5244
即可进入AList控制台,如图
6. 用户名:admin
密码:在cmd窗口中,如图
。你可以使用鼠标左键在终端中框选内容然后单击鼠标右键进行复制操作
7. 注意,在cmd中,鼠标左键点击或拖动cmd的终端界面会导致进入选择状态,程序将会被系统阻塞,需要在终端界面点按鼠标右键解除。若进程被阻塞,cmd的进程名会多一个选择,请注意。如图是程序被阻塞的例子,在终端界面点按鼠标右键即可解除
8. 现在,你已经成功以管理员身份登入了AList,
9. 单击最下面的管理
10. 你会进入到如图界面。尽管AList运行在本地,也建议更改你的用户名和密码
11. 更改账密,重新以新账密登录
12. 进入控制台,然后单击存储,如图
13. 选择添加,如图
14. 详细配置如图。挂载路径即AList展示路径,推荐使用/R2/你的存储桶名字
,地区为auto
,根文件夹路径为/
(图上填反了Orz)
15. 回到主页,如图
16. 尝试上传文件,如图
17. 可以看到,速度非常快
18. 为你的图床创建目录以分类横屏和竖屏图等,以便下文使用Workers连接R2来调用。后文我将使用/ri/h
作为横屏随机图目录、/ri/v
作为竖屏随机图目录
export default {
async fetch(request, env, ctx) {
// R2 bucket 配置
const bucket = env.MY_BUCKET;
try {
// 列出 /ri/h 目录下的所有对象
const objects = await bucket.list({ prefix: 'ri/h/' });
// 从列表中随机选择一个对象
const items = objects.objects;
if (items.length === 0) {
return new Response('No images found', { status: 404 });
}
const randomItem = items[Math.floor(Math.random() * items.length)];
// 获取选中对象
const object = await bucket.get(randomItem.key);
if (!object) {
return new Response('Image not found', { status: 404 });
}
// 设置适当的 Content-Type
const headers = new Headers();
headers.set('Content-Type', object.httpMetadata.contentType || 'image/jpeg');
// 返回图片内容
return new Response(object.body, { headers });
} catch (error) {
console.error('Error:', error);
return new Response('Internal Server Error', { status: 500 });
}
},
};
wrangler.toml
中填入:[[r2_buckets]]
binding = "MY_BUCKET"
bucket_name = "114514"
保存修改,点击右上角的部署
在设置-变量找到R2存储桶绑定,添加你的存储桶,变量名即上文的MY_BUCKET
在设置-触发器添加你的自定义域名以便访问
如:<img src="你的域名" alt="">