-
released this
2026-09-16 03:30:12 +08:00 | 24 commits to main since this releaseOpenDance Studio -- Web 管理服务端 v0.2.3
修复导入 PMX 模型返回 500,以及 GBK 压缩包丢贴图。 契约与 v0.2.2 相同
(rest-api / data-models / model-formats 0.4.0、database 0.3.0)。根因一:500 Internal server error
样本
【奥黛塔】_by_原神.zip(643 根骨骼、93,350 面)转换本身成功
(GLB 23.7MB、1.2s),但分析结果里的骨骼树按骨骼逐条展开,JSON 实测 70,980 字节,
而models.stats是TEXT(上限 65,535)。MySQL / MariaDB 严格模式直接拒绝写入
(ER_DATA_TOO_LONG / 1406), 而这一步没有兜底 -> 未捕获 -> 500。根因二:18 张贴图只内嵌了 17 张
tex/髮.png的 GBK 字节是F3 8C。文件名解码先试 Shift-JIS, 而 WHATWG 的
shift_jis把未定义码位映射成私用区不可见字符(不是 U+FFFD), 于是被判为
「解码成功」, 永不回退 GBK; 贴图名对不上就丢图。本次改动
models.stats-> MEDIUMTEXT(实体mediumtext+ transformer 保留 JSON 语义;
不用simple-json以免实体元数据与库列型不一致), 新增迁移
AddModelStatsMediumText1789550000000(install.sh会自动执行);- 新增
shrinkStatsForStorage()兜底: 即使库没迁移, 也只截断骨骼树
(父在前, 保留祖先链), 面数 / 骨骼数 / humanoid 覆盖 / 可驱动性 / warnings
全部保留; 服务层只在 1406 / DATA_TOO_LONG 时裁剪重试一次, 其它 DB 错误照旧抛出; - 压缩包文件名解码把「私用区字符」也算解错信号并回退 GBK —— 实测该模型贴图
由 17/18 变为 18/18 全部内嵌; - 新增 12 项测试; 测试规模 13 文件 / 205 项。
已经在跑旧版本的服务器
不改代码也能立刻解除 500(把列扩到 16MB 即可, 旧代码写入的数据不变):
ALTER TABLE models MODIFY stats MEDIUMTEXT NULL;执行的数据库与账号就是
deploy/.env里的DB_NAME/DB_USER:mysql -h 127.0.0.1 -u "$DB_USER" -p "$DB_NAME" \ -e "ALTER TABLE models MODIFY stats MEDIUMTEXT NULL;"改完直接重新导入该压缩包即可(无需重启服务)。
想同时拿到「18/18 贴图」与后续兜底, 再部署 v0.2.3:cd /root curl -LO https://gitea.kasugano.cn/zijunchiang/opendance-web/releases/download/v0.2.3/opendance-web-v0.2.3.tar.gz curl -LO https://gitea.kasugano.cn/zijunchiang/opendance-web/releases/download/v0.2.3/SHA256SUMS sha256sum -c SHA256SUMS tar -xzf opendance-web-v0.2.3.tar.gz && cd opendance-web-v0.2.3 bash deploy/install.sh # 自动执行 AddModelStatsMediumText 迁移并重启服务迁移完成后
GET /health的database.migrationsPending应为 0。校验
opendance-web-v0.2.3.tar.gzsha256:d8aefad75baa8080e47c72a95b7990ca15af04d9e58c8492dea5c0ae5c0d3a2dDownloads