# 媒体压缩与检测 > **服务端图片硬上限:≤ 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。