fix(media-upload): H5 pathToFile 修复 multipart filename 缺扩展名
PR-FRONTEND-MEDIA-UPLOAD-FIX-HOTFIX (2026-09-16)
诊断: 直接打后端 (curl) 验证后端 ext_rule 完全 OK,
所有 jpg/png/heic 标准 mime 都返回 code:0, 只有 filename=空
(无扩展名) 才会被拒. 所以问题在前端.
定位: common/js/media-upload.js pathToFile() H5 分支:
原代码 filePath.split('/').pop() 对 blob:http://xxx/uuid
取出 'uuid' (无扩展名)
→ new File([blob], 'uuid', ...) 没有 .jpg/.png 后缀
→ multipart Content-Disposition: filename='uuid'
→ 后端 fileExt 规则检查 'uuid' 不在白名单 → 拒绝
修复: 提取 extractExt() 到模块顶层 (之前内联在 uploadViaSts 里),
pathToFile 调用 extractExt(filePath, blob.type) 三段兜底:
1) filePath 最后一段正则
2) filePath.name 兜底
3) blob.type mimeHint 反查 EXT_MIME_MAP → png/jpg/heic 等
修复后 multipart filename = 'test-img1.png' (有扩展名),
后端 ext_rule 通过, 上传成功.
E2E 验证 (verify_filename2.py):
- 修复前: filename='test-img2' → 后端拒绝
- 修复后: filename='test-img2.png' → 后端接受
教训: PR-FRONTEND-MEDIA-UPLOAD-FIX 加 extractExt 时只修了 STS 路径,
PHP 路径漏修; H5 blob URL + multipart 是双盲点 (前端不知道后端需要
filename 扩展名, 后端拿到 filename 才检查). 任何 file.toBlob() 或
URL.createObjectURL 出来的 file 都要在 File 构造时补扩展名.