白嫖worker 自建短链服务 Url-Shorten-Worker 变身文件保管站 File Storage 保存到 R2对象存储

前言

之前 我们实现了 Url-Shorten-Worker 变身图床 Image Hosting 把图片转为Base64保存到KV
其实不只保存图片, 也是可以保存各种文件的. 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 账户 ID 
R2_ACCESS_KEY_ID     - S3 API Access Key ID 
R2_SECRET_ACCESS_KEY - S3 API Secret Access Key 
R2_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
中间那一长串数字和字母就是这个信息, 如
这个信息不仅仅存在于这里, 在其它地方也可以得到, 如果你搜的教程或问的AI让你从其它地方得到, 也可能是正确的.

R2_BUCKET_NAME       - R2 存储桶名称 

在cloudflare面板 - ... - R2 - Overview - "Create bucket"

输入 "Bucket name", 点击 "Create bucket"
这里你输入的 "Bucket name", 就是这个变量.

R2_PUBLIC_URL        - R2 公开访问 URL

在你刚刚建立了R2对象存储后, 进入 "Settings" 页面

打开 "Public Development URL"

显示出来的这个URL https://pub-****.r2.dev/ , 就是这个变量

* 上面说的是一个开发调试用的URL. 
如果按 cloudflare 推荐的用法, 是使用你自己的域名.

如果你用这个方案成功添加了你自己的域名后, 
https://你添加的域名 就是这个变量

R2_ACCESS_KEY_ID     - S3 API Access Key ID
R2_SECRET_ACCESS_KEY - S3 API Secret Access Key 

在cloudflare面板 - ... - R2 - Overview - Manage

Create User API token

选择 "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:签名错误,不是 CORS

R2 在 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",把我们带偏了。

评论

The Hot3 in Last 7 Days

酒馆SillyTavern 玩英文角色卡 也能以中文输出 设置世界书Lorebooks

白嫖worker 自建短链服务 Url-Shorten-Worker 显示短链的二维码QRcode