企业知识库上传链接 · 总量保险丝

改动说明 · 2026-06-02 · commit 6f0bc48

一句话

给「发给甲方销售的免登上传链接」加一道总量上限:同一条链接累计上传超过 2000 张就拒收,防止异常灌量把存储和视觉大模型刷爆。链接本身永不变,对销售完全透明

为什么要做

上传接口原本已有四道门:token 校验(启用 / 过期)、文件类型白名单、单图 10MB 上限、同图 sha256 去重。但缺的是总量闸门——一条链接理论上能无限次上传,而每张图都会同步调一次视觉大模型(成本大头)。一旦被脚本或误操作刷量,存储和模型调用都没有上限。

改了什么

数据库

新增 max_uploads

enterprise_upload_tokens 表加一列 max_uploads INTEGER NOT NULL DEFAULT 2000。每条上传链接挂一个上限数字,默认 2000。

文件:supabase/migrations/20260602180135_upload_token_max_uploads.sql(含 rollback)

接口

上传前先查总量

POST 收到图片后,在干任何重活之前(读文件 / 算 sha256 / 调大模型)先统计该 token 累计上传行数,≥ max_uploads 直接返回 429 quota_exceeded。走已有索引,查询很轻。

文件:src/app/api/upload/[token]/route.ts

上传页

软文案提示

撞上限时,销售看到的是「本次上传已达上限,请联系对接人」,而不是冷冰冰的"上传失败"。

文件:src/app/upload/[token]/form.tsx

对甲方销售的影响

零操作、无感。销售始终用最早发的那一条链接,URL 永不改变。这道闸只在「出意外灌量」时才触发,正常用根本碰不到。

撞到上限时怎么办(运维侧)

1
销售那一刻会看到「已达上限」的提示,暂时传不了。
2
我方在数据库把该 token 的 max_uploads 数字调大(比如 2000 → 5000)。
3
销售立刻恢复上传,链接不用换、不用重发

上传链路 · 五道门一览

顺序作用状态
1token 校验启用 / 未过期才放行原有
2文件类型白名单仅 jpg / png / webp原有
3单图 10MB 上限超大图拒收原有
4sha256 去重同 org 同图只入一次原有
5总量保险丝累计超 max_uploads 拒收本次新增

上线说明

这条改动含数据库 migration,需经 supabase-migrate.yml(push 到 main 自动 db push)才能让 max_uploads 列生效到生产库。代码已 push(6f0bc48),请确认该 workflow 跑绿后保险丝才真正起作用。