给「发给甲方销售的免登上传链接」加一道总量上限:同一条链接累计上传超过 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
max_uploads 数字调大(比如 2000 → 5000)。| 顺序 | 门 | 作用 | 状态 |
|---|---|---|---|
| 1 | token 校验 | 启用 / 未过期才放行 | 原有 |
| 2 | 文件类型白名单 | 仅 jpg / png / webp | 原有 |
| 3 | 单图 10MB 上限 | 超大图拒收 | 原有 |
| 4 | sha256 去重 | 同 org 同图只入一次 | 原有 |
| 5 | 总量保险丝 | 累计超 max_uploads 拒收 | 本次新增 |
supabase-migrate.yml(push 到 main 自动 db push)才能让 max_uploads 列生效到生产库。代码已 push(6f0bc48),请确认该 workflow 跑绿后保险丝才真正起作用。