字幕组图床
字幕组后台的图床工具:粘贴、拖拽或选择图片,服务端按格式转 WebP 或保留原格式后生成 BBCode、HTML、Markdown 和直链。
字幕组图床位于 /groups/<slug>/image-host,菜单名称是 图床。它只对已加入该字幕组组织的成员开放;普通登录用户和未加入该字幕组的用户不能上传、查看管理列表或删除图片。
公开短链 /i/<shortCode> 只展示已经上传的图片,不提供上传或管理能力。
页面结构
图床页面采用 单入口上传 + 下方图片管理 的结构,避免顶部模式切换或两栏上传面板。上传区始终在页面上方,历史图库在下方按时间分页加载。
- 上传:点击上传区选择图片,也可以拖拽图片到上传区,或在页面中直接粘贴剪贴板图片。上传任务不会显示成独立队列;进行中和失败数量只以小状态标记展示。
- 刚上传:上传成功后,复制格式直接显示在页面结果区,方便马上粘贴到论坛、公告或发布说明。多张上传会以紧凑横向缩略图切换。
- 图片管理:用于浏览该字幕组已经上传的图片。图库使用小缩略图密集网格、懒加载和分页加载,适合后续管理大量图片;需要完整 BBCode、HTML、Markdown 与直链时,点击复制格式打开弹层,不会撑开或打乱图库布局。
上传方式
- 支持点击选择图片、拖拽图片到上传区、在页面中直接粘贴剪贴板图片。
- 请求体是原始图片二进制,浏览器不会用 multipart/FormData 包装。
- 服务端会在读取图片内容前先完成登录与字幕组成员授权,避免非成员消耗转码资源。
图片处理规则
| 项目 | 当前规则 |
|---|---|
| 输出格式 | 静态 JPEG/PNG/WebP/GIF/BMP/AVIF/HEIC/HEIF 会优先转成 image/webp;无法可靠转码时保留原格式。 |
| 默认大小上限 | 单张输入默认 20 MiB,可由部署环境调整。 |
| 默认像素上限 | 解码后默认最多 50,000,000 像素。 |
| 默认最长边 | 输出最长边默认 3840px,按比例缩小,不放大。 |
| 默认质量 | WebP quality 默认 88。 |
| 服务端并发 | 转码默认 8 并发,硬上限 8。 |
| SVG | 支持上传并保留 image/svg+xml 原格式。 |
| 动画 GIF / 动画 WebP / APNG | 支持上传并保留原格式,不抽帧、不压成静态图。 |
图片转码和对象存储写入都在 TanStack Start 的 Bun Web runtime 内完成:Bun.Image 负责可解码静态图的解码、自动方向、缩放与 WebP 编码;Bun.S3Client 负责按实际输出 Content-Type 写入图床专用对象桶。删除图片时,Convex 会先完成权限校验、软删除元数据并投递 media/r2_object_delete_batch,再由 Bun background-worker 使用原生 Bun.S3Client 异步删除对象。Convex 不处理图片二进制或对象存储 IO。
复制格式
上传成功后,上传工作区会在结果区生成以下格式:
- BBCode:
[img]https://i.anibt.net/image-host/2026/07/05/Ab3CdE1/pasted-image.webp[/img] - BBCode 链接:
[url=https://anibt.net/i/Ab3CdE1][img]...[/img][/url] - BBCode 直链:
[url=https://i.anibt.net/image-host/...webp][img]...[/img][/url] - HTML:
<img src="..." alt="pasted-image.webp" title="pasted-image.webp"> - HTML 链接:
<a href="https://anibt.net/i/Ab3CdE1" target="_blank" rel="noopener noreferrer"><img ...></a> - HTML 直链:
<a href="https://i.anibt.net/image-host/...webp" target="_blank" rel="noopener noreferrer"><img ...></a> - Markdown:
 - 直接链接:
https://i.anibt.net/image-host/...webp;保留原格式时扩展名会是.gif、.svg、.apng等对应格式。
管理与删除
图片管理区域展示该字幕组的历史上传。成员可以预览图片、复制直链、打开图片直链或删除有权限的图片;需要全部复制格式时,点击复制格式按钮打开弹层。
删除权限:
- 上传者可以删除自己上传的图片。
- 字幕组 owner/admin 可以删除该组图片。
- 站点管理员可以删除任意字幕组图床图片。
删除时 Web runtime 会先向 Convex 请求删除授权和对象 key,再调用 Convex 将元数据标记为已删除并投递 media worker 删除任务。图片会立即从列表和短链查询中消失;直链对象可能短时间仍可访问,直到 background-worker 完成异步删除。
管理员近期审查
站点管理员可在 /admin/image-host 查看近期上传的图床图片。该页面按上传时间展示跨字幕组记录,并使用密集小缩略图网格,便于快速扫过大量近期图片并检查敏感、违规或不适合公开展示的内容。
管理员可以从近期审查页复制直链、打开图片直链、查看完整复制格式,并删除任意字幕组的图床图片。该页面只对站点管理员开放,不面向普通用户或普通字幕组成员。
部署要求
图床必须使用独立对象桶和专用访问密钥。生产环境需要配置:
| 环境变量 | 说明 |
|---|---|
IMAGE_HOST_R2_BUCKET | 图床专用桶名。 |
IMAGE_HOST_R2_ENDPOINT | S3/R2 endpoint;可填账号级 endpoint,带 /<bucket> 路径时会校验并归一化。 |
IMAGE_HOST_R2_ACCESS_KEY_ID | 图床桶 access key。 |
IMAGE_HOST_R2_SECRET_ACCESS_KEY | 图床桶 secret key。 |
IMAGE_HOST_PUBLIC_DOMAIN | 公开图片域名;裸域名会自动补 https://。仅 Web runtime 需要。 |
Web runtime 和 media background-worker 都需要同一套 IMAGE_HOST_R2_* 配置;IMAGE_HOST_PUBLIC_DOMAIN 只需要配置在 Web runtime。生产 Docker 镜像会在构建阶段检查 Bun.Image 和 Bun.S3Client。如果运行时不支持这两个原生 API,构建会失败。