laoyang
0365098fa4
修复:空格式白名单反而拒绝一切文件;定位「填 0 时正文图传不上」真因 (#4)
## 一、定位用户报的「提交反馈里图片不显示」
用户先说正文图不显示、回复的却显示,随后反馈「现在可以了,但之前确实不行」。
真因在 #4 已修掉,但当时没写清楚机制:
for (var i = 0; i < files.length; i++) {
if (countOf(kind) >= maxCount) {
alert("最多上传 " + maxCount + " 个");
break; // ← 整批文件一个都不传
}
}
数量上限填 0(本意不限)时,countOf 是 0、maxCount 是 0,
`0 >= 0` 为真 ⇒ 弹「最多上传 0 个」⇒ break 跳出整个循环 ⇒
选中几张就全部丢弃。上传区看起来"正常"(只是弹了个框),
提交后正文自然没有图。
已在线上核实用户新发的那条:aid=2 tid=2 reply_id=NULL,
附件正确挂在主题正文,详情页 .atts 渲染出 1 个 img,media.php 返回 200 / 225KB。
## 二、顺带修同一段里的第二个同类陷阱
var allowed = (box.getAttribute("data-accept") || "").split(",");
if (allowed.length && allowed.indexOf(file.type) < 0) { ... 拒绝 ... }
`"".split(",")` 返回 `[""]`,长度是 1 不是 0。
所以「未配置格式白名单」时,allowed.length 判真、indexOf 永远 -1
⇒ 空列表反而拒绝一切文件,这与"没配置=不限格式"的意图相反。
修法:split 后 filter 掉空项。实测:
normal : allowed=["image/jpeg","image/png"] len=2 blocked=false
empty : allowed=[""] len=1 blocked=true ← 旧代码
当前 UI 没有清空 mimes 的入口,现网触发不到,但属于同一类
「空/0 被当成最严格限制」的坑,一并修掉。
## 三、资源版本 14 → 15
🔴 上一轮就是改了 app.js 却忘升版本,浏览器一直用缓存旧 JS,
导致修复看起来"没生效"。这次改完立刻升,三处引用
(layout.php 的 css/js、install.php 的 css)都走 FB_ASSET_V 常量。
## 四、新增专项与反向验证
`_tooling/feedlite/fb_attach_zero_js.py`:19 项。
关键设计:数量判断条件**从源码正则抽取**后注入 node harness,
不在测试里硬编码正确写法 —— 否则修复被回退时测试照旧全过,成了假通过。
反向验证(故意把修复回退):
- 正常版本 19/19
- 回退版本 12/19,B1/B2/B4/B6/B9 全部 FAIL,能准确定位
⚠️ 第一版 harness 的 countOf 返回固定值,导致 B3/B8("传着传着到上限")
假通过。改成动态读递增计数后才是真验证。
回归:全新安装 33/33、附件 22/22、老基线 25/25、约束检查 20/20。
2026-11-02 10:42:03 +08:00
..
2026-11-01 16:39:09 +08:00
2026-11-02 08:55:23 +08:00
2026-11-02 10:42:03 +08:00
2026-09-28 20:34:37 +08:00
2026-11-01 16:39:09 +08:00
2026-11-02 08:55:23 +08:00
2026-09-28 20:34:37 +08:00
2026-11-01 16:39:09 +08:00
2026-11-02 08:55:23 +08:00