白嫖worker 自建短链服务 Url-Shorten-Worker 变身文件保管站 File Storage 保存到 R2对象存储
前言
之前 我们实现了 Url-Shorten-Worker 变身图床 Image Hosting 把图片转为Base64保存到KV
如果你用这个方案成功添加了你自己的域名后,
R2_ACCESS_KEY_ID - S3 API Access Key ID
生成的 Access Key ID 和 Secret Access Key 就是这个变量
其实不只保存图片, 也是可以保存各种文件的. pdf啊, zip啊, 等等 都可以的.
那么就会遇到KV保存容量限制的问题.
思路
如果我们把文件保存到 R2 对象存储呢?
面向GPT开发
Hermes 对接 mimo-v2.5-pro
Hermes 对接 claude-opus-4.8
把 https://github.com/crazypeace/Url-Shorten-Worker 项目 clone 到本地, 把整个项目学习分析一遍
我要做这样一个新开发, 你与我讨论方案, 不要实施.开发一个新的系统模式保存到R2对象存储的文件保管站 file-r2把图片保存在R2数据库,把 R2数据库 的链接作为 value, 保存在 KV用户操作的前端页面保持与 imghost 项目一样
很多细节上的设计, 打磨, 测试, 反复 略.
Github
简要使用说明
如果你已经参考以前的教程搭建了以前的项目.
那么你需要:
更新 worker.js
注意设置
theme: "theme/file-r2-lite",system_type: "file-r2",
再设置5个变量
R2_ACCOUNT_ID - R2 账户 IDR2_ACCESS_KEY_ID - S3 API Access Key IDR2_SECRET_ACCESS_KEY - S3 API Secret Access KeyR2_BUCKET_NAME - R2 存储桶名称R2_PUBLIC_URL - R2 公开访问 URL, 如 https://pub-xxxx.r2.dev
其实这5个变量, 我比较推荐你与一个有识图功能的AI互动, 来指导你一步一步怎么操作, 如果你搞不懂要点哪里的时候, 就截屏发给AI问.
因为这几年间cloudflare的界面会改变, 就算我发了操作界面截图, 如果cloudflare的界面改了, 就失效了.
不管怎样, 这回我还是发一下现在cloudflare的界面如何得到这5个变量.
R2_ACCOUNT_ID - R2 账户 ID
在你登录 cloudflare面板 https://dash.cloudflare.com/ 之后, 浏览器url栏中, 会显示为
https://dash.cloudflare.com/****/home/overview
中间那一长串数字和字母就是这个信息, 如
R2_BUCKET_NAME - R2 存储桶名称
在cloudflare面板 - ... - R2 - Overview - "Create bucket"
这里你输入的 "Bucket name", 就是这个变量.
R2_PUBLIC_URL - R2 公开访问 URL
在你刚刚建立了R2对象存储后, 进入 "Settings" 页面
打开 "Public Development URL"
如果按 cloudflare 推荐的用法, 是使用你自己的域名.
如果你用这个方案成功添加了你自己的域名后,
R2_ACCESS_KEY_ID - S3 API Access Key ID
R2_SECRET_ACCESS_KEY - S3 API Secret Access Key
在cloudflare面板 - ... - R2 - Overview - Manage
选择 "Object Read & Write" - "Specify bucket(s)" - 选择你刚刚创建的
生成的 Access Key ID 和 Secret Access Key 就是这个变量
========
后记
好久之前的项目了, 一直有想法, 也知道原理上可行, 但是一直懒得动手.
现在好了, 有AI动手, 我只要动嘴皮子.
用 opus-4.8 解决了一个难点
当时, 上传文件到R2失败, mimo-2.5-pro告诉我是 CORS 的问题, 但是设置了 CORS 后, 仍然上传失败.
怎么都解决不了.
这时, 我去群里捡了一个 opus 4.8. 我跟TA说, 我给你换了模型, 你重新全量审查一下代码.
然后就发现了问题所在.
我没有盲目相信"这是 CORS 问题",而是用 curl 绕过浏览器直接测了签名 —— 结果定位到真正的根因。真正的 bug:签名错误,不是 CORSR2 在 403 响应里回传了它自己计算的 CanonicalRequest,和我们的一对比就看出来了:- R2 期望:X-Amz-Credential=...2cff98bb...%2F20260609%2Fauto%2Fs3%2Faws4_request(斜杠编码成 %2F)- 我们生成:X-Amz-Credential=...2cff98bb.../20260609/auto/s3/aws4_request(斜杠没编码)在 presigned URL 里,query 参数值的斜杠必须编码成 %2F。R2 重建 canonical request 时会按编码后的值算,所以两边签名永远对不上 → SignatureDoesNotMatch → 403。浏览器把这个 403 显示成了"CORS header missing",把我们带偏了。
评论
发表评论