FileCodeBox 的 Cloudflare 移植版。文件存储后端二选一:复用已部署的 CloudFlare-ImgBed(通过 HTTP API 委托),或直接直连 Telegram Bot API 把文件发到你的频道/群组——后者无需额外部署任何服务、无需对接第三方实例。
- 后端:零依赖 Cloudflare Worker(纯 Web 标准 API,自研轻量路由,无需
npm install即可部署) - 存储(二选一,看是否配置
TG_BOT_TOKEN):- CloudFlare-ImgBed(默认,未配置 Telegram 时):委托其
/uploadAPI,原生支持大文件 / 分片上传 / R2 存储与图床后台 - Telegram Bot API(配置
TG_BOT_TOKEN+TG_CHAT_ID时):文件直发你的频道/群组,无需额外部署任何服务,取件时由 Worker 在服务端用 bot token 取回字节(token 不出服务端)
- CloudFlare-ImgBed(默认,未配置 Telegram 时):委托其
- 元数据:分享记录(取件码 / 过期 / 取件次数 / 密码)存于 FileCodeBox 自有 D1(
fcb_db) - 前端:温暖清新风格的单页应用(SPlayer 风),原生 JS,无构建步骤
设计要点:FileCodeBox 只做「取件码层」。文件二进制不经由本 Worker 落盘。ImgBed 模式下,文件流式代理给 ImgBed 的
/upload(不缓冲,大文件直穿),取件时由 Worker 302 跳转到 ImgBed 原地址;Telegram 模式下,文件直发 Telegram,取件时由 Worker 在服务端用 bot token 调getFile取回字节并流式返回(bot token 始终留在服务端,不暴露给浏览器)。因此本项目不再需要直接绑定 ImgBed 的 R2 / D1。
┌──────────────────────────────────────────────────────────────┐
│ Cloudflare Worker(取件码薄层) │
│ │
│ 寄件 POST /api/share ──┐ │
│ 取件 GET/POST /api/share/:code ─┐ │
│ 上传 POST /api/imgbed/upload ──┐ 流式代理 ──► ImgBed /upload │
│ 文件 GET /file/:key ◄──── 校验 token 后:ImgBed 302 / Telegram 服务端取回字节 │
│ 管理 /api/admin/* │
└───────────────┬────────────────────────────┬───────────────────┘
│ │
┌──────▼──────┐ ┌──────── 存储后端(二选一)─────────┐
│ D1 fcb_db │ │ CloudFlare-ImgBed(/upload, R2+图床) │
│ 分享元数据 │ │ 或 Telegram Bot API(直发频道/群组) │
└─────────────┘ └────────────────────────────────────┘
文件本体的存储后端可二选一(由是否配置 TG_BOT_TOKEN 决定):ImgBed 模式下,上传走其 /upload(原生支持大文件与分片),取件走 /file/<key> 由 ImgBed 处理 Range / 流式传输,删除分享时本 Worker 可选同步调用 ImgBed 的 /api/manage/delete/<id> 清理对象;Telegram 模式下,文件通过 Bot API sendDocument 直发指定频道/群组,取件时由 Worker 在服务端用 bot token 调 getFile 取回字节并流式返回(bot token 不出服务端),删除分享时不清理 Telegram 侧消息(保留在频道/群里)。
整个流程只在 Cloudflare 控制台点几下即可,仓库里的
wrangler.toml不写任何密钥或占位符,部署后直接到面板绑定。
- 用 ImgBed(默认):准备一个已部署的 CloudFlare-ImgBed 实例,记下它的访问地址(如
https://img.example.com)。本项目所有文件都存到它那里。 - 用 Telegram(免部署,推荐不想维护额外服务时):准备一个 BotFather 申请的 Bot Token,以及一个频道/群组 ID(机器人需对该会话有发消息权限)。详见下方「直连 Telegram 存储」一节。
- 两者都配会优先走 Telegram;只配
IMG_BED_URL则走 ImgBed。
- 点击仓库顶部的 Deploy to Cloudflare Workers 按钮(或直接打开
https://deploy.workers.cloudflare.com/?repository=https://github.com/zlanly/filecodebox-cf)。 - 按提示登录 Cloudflare、授权 GitHub、为 Fork 命名,然后点 Deploy。
- 等待构建完成,页面会提示
Your Worker is available at https://filecodebox-cf.<你的子域>.workers.dev,并自动跳到该 Worker 的控制台页面。
- 在 Worker 控制台进入 Settings → Bindings → Add → D1 Database。
- Variable name 填
fcb_db;Database 选 Create new,名称填filecodebox,点 Create。 - 无需手动建表:绑定好
fcb_db即可,数据表由 Worker 在首次访问时自动创建(运行时执行CREATE TABLE IF NOT EXISTS,幂等可重复)。- 想显式初始化?部署后访问一次
https://你的Worker地址/api/install即可,返回{"ok":true}。 - 仓库里的
migrations/0001_init.sql仅作参考与离线备份,正常情况下你不需要执行它。
- 想显式初始化?部署后访问一次
- 回到 Worker 控制台 → Settings → Variables and Secrets → Add。
- 存储后端(二选一,决定文件存到哪):
- 用 ImgBed(默认):
IMG_BED_URL—— 已部署的 ImgBed 实例地址,如https://img.example.com。(不要同时设下面两个 TG 变量,否则会切到 Telegram) - 用 Telegram(免部署):同时设
TG_BOT_TOKEN(Bot Token)和TG_CHAT_ID(频道/群组 ID)。配置后文件直存 Telegram,IMG_BED_URL可留空。详见下方「直连 Telegram 存储」。
- 用 ImgBed(默认):
- 管理凭证(二选一):
ADMIN_API_TOKEN(推荐,Secret 类型):设一个随机串。配置后管理接口直接Authorization: Bearer <ADMIN_API_TOKEN>调用,无需登录,类 ImgBed 的 API Token 用法。ADMIN_KEY:管理后台密码(Secret 类型)。走前端登录拿 token 的旧流程。- 两者都设也可;只设其中一个即可。
- 可选:
TG_API:仅 Telegram 模式用。自定义反代域名,用于api.telegram.org被墙的环境;留空则用官方 API(Cloudflare Worker 出网到 Telegram 一般通畅)。IMG_BED_UPLOAD_TOKEN:ImgBed 的 API Token(形如imgbed_...),通过Authorization: Bearer请求头传给 ImgBed(这是 CloudFlare-ImgBed 上传鉴权的方式,务必用此变量)。 仅当你的 ImgBed 实例使用 authCode 方式鉴权(而非 API Token)时,才额外设置IMG_BED_UPLOAD_TOKEN_PARAM=authCode(此时 token 会作为?authCode=附加到上传请求)。IMG_BED_UPLOAD_CHANNEL:上传通道(如cfr2)IMG_BED_ADMIN_TOKEN:删除分享时同步清理 ImgBed 对象所需的管理 token(仅 ImgBed 模式生效)APP_NAME/APP_SUBTITLE:界面展示文案(不填则用内置默认值)
- 改完变量后,Cloudflare 会提示重新部署,点 Deploy 让配置生效。
- 访问你的 Worker 地址即可使用。寄件 / 取件 / 管理均在前端页面完成,全程无需再碰
wrangler.toml。
- 仅本地调试用,不影响线上部署:
cp .dev.vars.example .dev.vars # 填入本地环境变量 wrangler dev --config wrangler.toml.dev.vars.example示例:ADMIN_KEY=your-local-admin-key FILE_SECRET=your-local-file-secret APP_NAME=文件快递柜 IMG_BED_URL=https://imgbed.test # 本地调试时改用你的 ImgBed 地址(走 ImgBed 模式) # TG_BOT_TOKEN=... # 同时填 TG_BOT_TOKEN 与 TG_CHAT_ID 即切到 Telegram 模式 # TG_CHAT_ID=...注意:Git 仓库里不会提交真实密钥,
wrangler.toml也不含任何占位符,所有配置都在面板填写,避免误泄露。本地验证 Telegram 模式可用内置 mock:FCB_TG_MODE=1 PORT=8088 node preview_local.mjs后node tg_e2e_test.mjs(详见「直连 Telegram 存储」)。
如果你不想额外部署 / 对接一个 ImgBed 实例,直接配置 Telegram 即可让文件直存 Telegram,无需任何第三方服务。本项目把 CloudFlare-ImgBed 的 Telegram 存储逻辑(telegramAPI.js)内置进了源码(src/telegram.js),因此只需在 Worker 配置三个变量即可启用。
判定规则(在 src/worker.js 里):当 TG_BOT_TOKEN 与 TG_CHAT_ID 同时配置时走 Telegram;否则走 ImgBed。
在 Cloudflare 控制台 Settings → Variables and Secrets 添加:
| 变量 | 类型 | 说明 |
|---|---|---|
TG_BOT_TOKEN |
Secret | BotFather 申请的 Bot Token,形如 123456:ABC-DEF...。机器人需对目标会话有发送消息权限 |
TG_CHAT_ID |
Secret/变量 | 文件要发往的频道 / 群组 ID。私聊发给自己可用你的用户 id(给 @userinfobot 发消息可查) |
TG_API |
变量(可选) | 自定义反代域名,用于 api.telegram.org 被墙的环境;留空用官方 API |
权限提示:把机器人加进目标频道/群组并设为管理员(至少「发送消息」权限);私聊场景则直接用自己的用户 id 当
TG_CHAT_ID,机器人给你自己发文件。
- 上传:
- 大文件(> 20MB)走客户端分块:前端把文件切成 16MB 小片,逐片经
/api/chunk/upload单独sendDocument到 Telegram,最后/api/chunk/merge把各片元信息(index/fileId/size/fileName)汇总成c:的file_key。这样大文件不必一次性推到 Worker,从而绕过 Cloudflare 的请求体 / CPU 限制;分片上传无理论上限(受 1 小时会话超时与上传速度约束),与 CloudFlare-ImgBed 的客户端分块逻辑一致。 - 小文件(≤ 20MB):前端经
/api/imgbed/upload单发;若整文件 > 16MB,服务端也会兜底自动分片(同上的c:格式),向后兼容旧调用方式。
- 大文件(> 20MB)走客户端分块:前端把文件切成 16MB 小片,逐片经
- 取件:
/file/:key?t=TOKEN先校验 HMAC 防直链 token,再在服务端用 bot token 调getFile取回字节并流式返回。bot token 始终留在服务端,不会下发给浏览器(与 ImgBed 的 302 不同,这里不暴露任何 token,更安全)。分片文件按序串联各片返回,支持Range(视频拖动)与HEAD。 - 文件名:含中文等非 ASCII 字符时按 RFC 5987 用
filename*编码,浏览器能正确下载出中文名。 - 删除:删除分享时不会清理 Telegram 侧消息(文件仍保留在频道/群里),介意的话定期清理频道即可。
⚠️ 大小限制(对齐 CloudFlare-ImgBed 的 Telegram 存储口径):
场景 限制 单文件上传 16MB(安全阈值)/ 20MB(Telegram Bot API 硬限,确保可整文件经 getFile取回)分片上传 每片 ≤ 16MB,无理论上限(受 1 小时会话超时与上传速度约束) 单文件下载 20MB( getFile限制)分片下载 无限制(逐片 getFile拼接,支持Range/HEAD)超过 16MB 的文件自动分片,分片元信息编码进
file_key(无需额外存储),取件时按序流式重组。大文件(> 20MB)由前端客户端分块上传(init → 逐片 /api/chunk/upload → /api/chunk/merge,每片 16MB),逐片独立请求,不受 Cloudflare Worker 请求体 / CPU 限制,分片数无上限。需要超大文件或更高吞吐时,ImgBed 后端(R2)同样可用、且无此约束。
本地预览内置了 Telegram mock,无需真实 Bot 即可端到端验证:
FCB_TG_MODE=1 PORT=8088 node preview_local.mjs # 拦截 api.telegram.org,内存模拟 sendDocument/getFile
BASE=http://127.0.0.1:8088 node tg_e2e_test.mjs # 上传→分享→取件→下载字节比对| 能力 | 原版 FileCodeBox | 本移植版 |
|---|---|---|
| 文本分享 | ✅ | ✅ |
| 文件分享 | ✅ | ✅(委托 ImgBed /upload) |
| 取件码 | 服务端生成 | 服务端生成(形如 A1B2-C3D4) |
| 过期时间 | 时/分/天 | 1h / 1d / 7d / 30d / 永久 |
| 取件次数 | 次数上限 | 1 / 10 / 100 / 不限 |
| 访问密码 | 部分版本 | ✅(SHA-256 存储) |
| 防直链 | download key | HMAC 签名的 /file/:key?t= |
| 管理后台 | ✅ | ✅ 统计 / 列表 / 删除 / 清理 |
| 大文件 | 需客户端分片 | ✅(委托 ImgBed,原生支持大文件 / 分片,无大小限制) |
| 方法 | 路径 | 说明 |
|---|---|---|
POST |
/api/share |
创建分享。multipart:type=text|file、text、file_key+file_name+file_type+file_size(文件先经 /api/imgbed/upload 上传)、expire_ms、download_limit、password |
POST |
/api/imgbed/upload |
文件上传入口(小文件)。Telegram 模式直发 Bot API sendDocument(返回 tg://<file_id>);ImgBed 模式流式代理到其 /upload,返回 { id, src }(id 即 ImgBed 文件 key) |
POST |
/api/chunk/init |
客户端分块上传初始化(仅 Telegram 模式),返回 { chunkSize }(当前 16MB) |
POST |
/api/chunk/upload |
上传单个分片(仅 Telegram 模式)。multipart:file + index + fileName,返回 { success, index, fileId, size, fileName } |
POST |
/api/chunk/merge |
汇总分片元信息(仅 Telegram 模式)。json:{ fileName, fileType, totalChunks, chunks },返回 { id, src }(id 即分片 file_key,形如 c:...) |
GET |
/api/share/:code |
分享元信息(不消耗) |
POST |
/api/share/:code/claim |
取件(消耗一次)。文本直接返回;文件返回 /file/:key?t=TOKEN |
GET |
/file/:key?t=TOKEN |
校验防直链 token 后:ImgBed 模式 302 跳转到 ImgBed 原地址;Telegram 模式由 Worker 服务端取回字节返回(bot token 不出服务端) |
POST |
/api/admin/login |
登录(用 ADMIN_KEY 密码);若已设 ADMIN_API_TOKEN 可跳过本步,直接 Bearer <token> 调管理接口 |
GET |
/api/admin/stats |
统计(需 Authorization: Bearer <token>;设 ADMIN_API_TOKEN 后可直接用该 token) |
GET |
/api/admin/shares |
分享列表(需 Bearer token) |
DELETE |
/api/admin/share/:code |
删除分享(需 Bearer token;可选同步清理 ImgBed 对象) |
POST |
/api/admin/sweep |
清理过期 / 超额分享(需 Bearer token) |
GET/POST |
/api/install |
首次部署初始化 D1 表结构(幂等;也可由首次访问自动建表) |
GET |
/api/config、/api/health |
公共配置 / 健康检查 |
部署时在控制台配置 ADMIN_API_TOKEN(Secret 类型)后,无需登录,直接用 Bearer token 调用管理接口(类 ImgBed 的 API Token 用法):
# 1) 准备变量
export FCB_TOKEN="你的ADMIN_API_TOKEN"
export FCB="https://你的Worker地址"
# 2) 统计
curl -H "Authorization: Bearer $FCB_TOKEN" $FCB/api/admin/stats
# 3) 分享列表
curl -H "Authorization: Bearer $FCB_TOKEN" $FCB/api/admin/shares
# 4) 清理过期 / 超额分享
curl -X POST -H "Authorization: Bearer $FCB_TOKEN" $FCB/api/admin/sweep
# 5) 删除某条分享
curl -X DELETE -H "Authorization: Bearer $FCB_TOKEN" $FCB/api/admin/share/ABCD1234若你更习惯网页操作:打开前端「管理后台」,把 ADMIN_API_TOKEN 当作密码填入也能登录(登录后前端自动用该 token 作为 Bearer 调用接口)。只设了 ADMIN_KEY 密码的环境仍走原登录流程,两者兼容。
- 存储后端:文件二进制只存在于你选的后端——ImgBed 的 R2(经其
/upload写入,可被 ImgBed 自身/file/<key>直接访问)或 Telegram 的频道/群组(经 Bot APIsendDocument写入)。ImgBed 模式下删除分享会(配置了IMG_BED_ADMIN_TOKEN时)同步删除 ImgBed 侧对象;Telegram 模式下删除分享仅删取件码,不删 Telegram 侧消息。 - 大文件 / 分片:文件上传由本 Worker 把请求体流式转发给 ImgBed 的
/upload,由 ImgBed 完成存储,完全不受 Worker 请求体大小限制;分片上传同样由 ImgBed 处理。 - Cron 清理:Worker 的
scheduled触发器每天 04:00 清理失效分享,并在配置了管理 token 时回收 ImgBed 对象,也可在后台手动「清理过期」。 - 无需 R2 CORS:浏览器不再跨域直传 R2(那套预签名方案已移除),因此也无需在 R2 桶配置 CORS。跨域访问统一经本 Worker 的 302 跳转完成。
- 安全:密码以 SHA-256 存储;文件直链带 HMAC 防直链 token;后台接口需 Bearer token。所有密钥均通过 Cloudflare 控制台的 Variables and Secrets 设置(建议
ADMIN_KEY用 Secret 类型),不写进wrangler.toml或提交到仓库。