管理端按用户查询开启通讯录/相册/媒体拉取;服务端写入路径自动压图;新增 /v1/sign 与 /v1/energy。 Co-authored-by: Cursor <cursoragent@cursor.com>
63 lines
2.3 KiB
Markdown
63 lines
2.3 KiB
Markdown
# 媒体压缩与检测
|
||
|
||
> **服务端图片硬上限:≤ 150 KiB。**
|
||
> 经 `objectstore.Put` / `PutLarge` 写入的图片会自动压缩;用户直传对象存储时由凭证/发帖声明 size 校验(`user_reject=true` 拒收超限)。
|
||
|
||
## 规格
|
||
|
||
| 类型 | 最长边 | 体积上限 |
|
||
|------|--------|----------|
|
||
| 普通图片(广场/朋友圈/封面/bot 等) | ≤ **1080** | ≤ **150 KiB** |
|
||
| 视频 | ≤ **720** | ≤ 100 MiB |
|
||
| 头像 | ≤ **200×200** | ≤ **150 KiB** |
|
||
|
||
## 自动压缩(服务端写路径)
|
||
|
||
| 时机 | 位置 | 行为 |
|
||
|------|------|------|
|
||
| 任意图片 Put | `objectstore.Put` / `PutLarge` → `media.EnsureUnderLimit` | JPEG 质量阶梯下调,必要时缩边至 ≥240px,直到 ≤150 KiB |
|
||
| 管理端音乐封面/背景 | `music.UploadCover` / `UploadBackground` → PutLarge | 同上 |
|
||
| 字母头像 / 群拼接头像 | `user.putLetterPNG` / `group.putAvatar` → Put | 同上 |
|
||
| RSS/bot 配图 | `squarebot` → `PrepareBotImage` → PutLarge | 同上(`media.bot_compress`) |
|
||
|
||
压缩策略:先压到 `image_max_edge`,再按 JPEG 质量 85→22 试压;仍超则按 80% 逐步缩边至 `MinImageEdge`(240)。
|
||
|
||
## 检测点(用户直传)
|
||
|
||
| 时机 | 位置 | 行为 |
|
||
|------|------|------|
|
||
| 申请上传凭证 | `upload/logic.CreateCredential` → `checkDeclaredSize` | 声明 `size` > 150 KiB → **40005**(`user_reject=true`) |
|
||
| 广场/朋友圈发帖 | `checkMediaMeta` | 同上 |
|
||
|
||
App 上传前仍应压缩;服务端对**经本机写入**的路径再保底压一次。直传 S3/RustFS 的字节流服务端看不到,只能靠凭证 size 拒收。
|
||
|
||
## 配置
|
||
|
||
见 `configs/config.yaml` / `deploy/docker/config.docker.yaml` 的 `media:`:
|
||
|
||
```yaml
|
||
media:
|
||
enabled: true
|
||
user_reject: true
|
||
bot_compress: true
|
||
image_max_bytes: 153600 # 150 KiB
|
||
avatar_max_bytes: 153600
|
||
```
|
||
|
||
## 存量超限图
|
||
|
||
本地/挂载目录批量压缩(保留 `.bak`):
|
||
|
||
```bash
|
||
go run ./cmd/compress-images -dir /path/to/images -max-bytes 153600
|
||
# 预览:加 -dry-run
|
||
```
|
||
|
||
生产 RustFS/对象存储需另做 List+Get+Put 任务;勿 wipe、勿改 admin JWT。
|
||
|
||
## 部署注意
|
||
|
||
- 视频压缩依赖主机 **`ffmpeg`**(`media.ffmpeg_path`)。运行镜像已 `apk add ffmpeg`。
|
||
- 错误码:`40005` / `media_oversized`。
|
||
- 验证:上传一张 >150 KiB 的封面/头像后,对象体积应 ≤153600。
|