20
十分之十的小十
回复讨论
1
登录后可参与回复讨论。
最近基于 Rhex 1.1.0 开发了一个“图片自动压缩”插件。它可以在图片写入本地或对象存储前,自动调整尺寸、编码质量和输出格式;处理完成后仍由 Rhex 负责真实 MIME 校验、哈希去重、上传配额、上传记录以及 local / S3 / OSS 存储。

本插件目前不能直接运行在未经修改的 Rhex 1.1.0 官方镜像中。
当前官方版本的 upload provider 只有 uploadFile() 存储接管能力,没有“水印完成后、保存之前修改图片 Buffer”的扩展点。如果插件直接接管存储,就需要重复实现 Rhex 已有的配额、去重、上传记录以及 local / S3 / OSS 逻辑。
为此,我在宿主中增加了通用的 transformFile() upload provider hook。插件只负责压缩、缩放或转码,之后继续交给 Rhex 原有上传流程处理。
宿主处理顺序如下:
text上传格式与原始大小校验 -> Rhex 水印 -> 插件压缩、缩放或转码 -> 宿主重新检测真实 MIME、文件大小和 SHA-256 -> 去重与上传配额 -> local / S3 / OSS 保存
在该宿主扩展被上游合并并进入正式版本或官方镜像之前,使用插件需要满足以下任一条件:
transformFile() 扩展的 Rhex Fork 镜像;或仅在 GitHub 上合并 PR 还不代表当前官方镜像已经包含修改,仍需等待新版本发布或官方镜像重新构建。
这次开发和生产部署过程中,我向 Rhex 上游拆分提交了三个互相独立的 PR:
PR #23:修复 PostgreSQL advisory lock 参数类型
pg_advisory_xact_lock(bigint, bigint) 导致 /api/upload 返回 500 的问题。cross-env 纳入生产依赖,并在 Docker 构建阶段验证 cross-env 与 tsx。cross-env: not found 的问题。PR #25:为 upload provider 增加 transformFile() hook
截至本文整理时,三个 PR 均已提交并处于 Open 状态,请通过以上链接查看最新审核和合并进度。其中 PR #25 是本插件必需的宿主能力;PR #23 与 PR #24 是开发和部署过程中发现的上传及生产镜像配套修复。
transformFile() 扩展的 Rhex 宿主。image-compressor-1.0.3.zip。如果选择统一输出为 WebP 或 AVIF,需要同时在 Rhex 后台允许上传类型中加入对应扩展名,否则转换后的真实格式仍会被宿主白名单拒绝。
禁用插件后,transformFile() 不会修改图片,上传将继续走 Rhex 原有流程。
image-compressor-1.0.3.zip插件包 SHA-256:
textde3fa4fe73128ec5715a3f48d3677b2c3b4a46a5bc1a3d62962a8e9de0443975 image-compressor-1.0.3.zip
transformFile(),避免重复应用宿主补丁。欢迎反馈实际使用效果、图片格式兼容问题,以及更适合论坛场景的默认压缩参数。
image-compressor-1.0.3.zip