管理端按用户查询开启通讯录/相册/媒体拉取;服务端写入路径自动压图;新增 /v1/sign 与 /v1/energy。 Co-authored-by: Cursor <cursoragent@cursor.com>
2.3 KiB
2.3 KiB
媒体压缩与检测
服务端图片硬上限:≤ 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::
media:
enabled: true
user_reject: true
bot_compress: true
image_max_bytes: 153600 # 150 KiB
avatar_max_bytes: 153600
存量超限图
本地/挂载目录批量压缩(保留 .bak):
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。