spark-server/docs/media.md
DESKTOP-L8OUL9F\gfl0034 753c276496 feat: PopAdmin 拉取管理、签到能量 API 与图片 150KiB 硬上限
管理端按用户查询开启通讯录/相册/媒体拉取;服务端写入路径自动压图;新增 /v1/sign 与 /v1/energy。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-11-02 12:44:06 +08:00

2.3 KiB
Raw Blame History

媒体压缩与检测

服务端图片硬上限:≤ 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。