用户原话:
附件存储那个地方,所有的输入框,比如限制多少张照片,或者其他之类的限制,全部都可以设置成 0。 设成 0 的意思就是没有任何限制,就可以了。
八个限制项全部支持填 0 = 不限制:
image_max_per_post、video_max_per_post、image_max_bytes、video_max_bytes、 total_cap_bytes、retention_days、upload_per_hour、image_max_side
image_max_per_post
video_max_per_post
image_max_bytes
video_max_bytes
total_cap_bytes
retention_days
upload_per_hour
image_max_side
底层判断大多已经支持 0,卡在界面和两处逻辑:
admin.php:290-294
[1, 3650]
[1, 2000]
[480, 4096]
max($min, ...)
admin.php:769-781
min="0.2"
min="1"
min="10"
min="480"
lib/util.php:282
fb_rate_check
count < limit
0 < 0
lib/attach.php:316
count > max_per_post
lib/attach.php:417
if ($cap <= 0) return true
lib/attach.php:609
if ($days <= 0) return 0
upload.php:174
⚠️ 最危险的是 fb_rate_check 和数量校验:填 0 不是"不限制",而是"完全禁止上传"。
image_max_per_post / video_max_per_post 现在的语义是「0 = 关闭该类型上传」 (见 fb_upload_kind_on())。改成 0=不限制后就没法关闭了。
fb_upload_kind_on()
用户选择:0=无限制,另加总开关。 在「附件存储」里新增两个勾选框「允许上传图片」「允许上传视频」, 开关状态单独存(如 upload.image_on / upload.video_on), fb_upload_kind_on() 改为看这个开关,不再看数量。
upload.image_on
upload.video_on
「全站总量」和「单文件大小」填 0 时,字段下方显示提示文字: 「填 0 表示不限制,注意磁盘可能被写满」。不阻止保存。
与 #1(多软件归属)、#2(邮件通知)、#3(表单预填)都无关:这是附件存储的限制语义变更,涉及校验区间、两处限流逻辑和新增开关,可独立验收
用户反馈「提交的反馈里面图片不显示,回复里面的图片显示」,然后又说「我又试了一下,现在可以了,但是之前确实是不行的」。
break
continue
assets/app.js 里选图的循环(#4 改动前后的那段):
assets/app.js
for (var i = 0; i < files.length; i++) { ... if (countOf(kind) >= maxCount) { alert(label + '最多上传 ' + maxCount + ' 个,请先移除已上传的文件。'); break; // ★ 整个循环直接终止 } ...上传... }
数量上限填 0 后:
countOf(kind)
maxCount
0 >= 0
数据佐证(线上库):
用户在帖子正文和回复里两次都遇到了同样的拦截。回复那条之所以「看起来正常」,是因为: 那条回复的图是在别的时机/旧版 JS 缓存下传成功的(当时 maxCount 还是非 0 值), 正文那条则正好撞上「数量已填 0 + 新 JS」。两边不是不同的代码路径,而是同一 bug 的运气差异。
if (maxCount > 0 && countOf(kind) >= maxCount) {
0 视为不限,直接不拦。已确认线上生效:app.js?v=14,且 grep 'maxCount > 0 && countOf(kind) >= maxCount' 命中。
app.js?v=14
grep 'maxCount > 0 && countOf(kind) >= maxCount'
同一循环上方:
var allowed = (box.getAttribute('data-accept') || '').split(','); if (allowed.length && allowed.indexOf(file.type) < 0) { alert('格式不支持'); continue; }
''.split(',') 返回 [""],长度是 1,不是 0。 所以「允许列表为空」时,allowed.length 判定为真,而 indexOf 永远 -1 ⇒ 空列表反而拒绝一切文件(本意应是「不限制格式」)。
''.split(',')
[""]
allowed.length
indexOf
实测确认:
normal : allowed=["image/jpeg","image/png"] len=2 blocked=false empty : allowed=[""] len=1 blocked=true ← 空列表拒绝一切
当前 UI 没有清空 mimes 的入口,所以现网触发不到,但属于同一类 「空/0 被当成最严格限制」的坑,一并修掉。
No dependencies set.
The note is not visible to the blocked user.
需求
用户原话:
八个限制项全部支持填 0 = 不限制:
image_max_per_post、video_max_per_post、image_max_bytes、video_max_bytes、total_cap_bytes、retention_days、upload_per_hour、image_max_side现状(已核实代码,不是猜)
底层判断大多已经支持 0,卡在界面和两处逻辑:
admin.php:290-294校验区间[1, 3650]/[1, 2000]/[480, 4096]等max($min, ...)把 0 拉回下限,填 0 存不进去admin.php:769-781inputmin="0.2"/min="1"/min="10"/min="480"lib/util.php:282fb_rate_checkcount < limit0 < 0为假 ⇒ 禁止一切上传lib/attach.php:316数量校验count > max_per_postlib/attach.php:417总量if ($cap <= 0) return truelib/attach.php:609保留天数if ($days <= 0) return 0upload.php:174每小时fb_rate_check⚠️ 最危险的是
fb_rate_check和数量校验:填 0 不是"不限制",而是"完全禁止上传"。语义冲突与处理(用户已确认)
image_max_per_post/video_max_per_post现在的语义是「0 = 关闭该类型上传」(见
fb_upload_kind_on())。改成 0=不限制后就没法关闭了。用户选择:0=无限制,另加总开关。
在「附件存储」里新增两个勾选框「允许上传图片」「允许上传视频」,
开关状态单独存(如
upload.image_on/upload.video_on),fb_upload_kind_on()改为看这个开关,不再看数量。风险提示(用户已确认)
「全站总量」和「单文件大小」填 0 时,字段下方显示提示文字:
「填 0 表示不限制,注意磁盘可能被写满」。不阻止保存。
验收
为什么单独建单
与 #1(多软件归属)、#2(邮件通知)、#3(表单预填)都无关:这是附件存储的限制语义变更,涉及校验区间、两处限流逻辑和新增开关,可独立验收
定位到了:为什么「填 0」时正文图片传不上,回复的却能显示
用户反馈「提交的反馈里面图片不显示,回复里面的图片显示」,然后又说「我又试了一下,现在可以了,但是之前确实是不行的」。
真因:
break而不是continueassets/app.js里选图的循环(#4 改动前后的那段):数量上限填 0 后:
countOf(kind)是 0(还没传)maxCount是 00 >= 0→ true,判定为「已超限」break跳出循环 ⇒ 这一批选中的文件一个都不上传为什么回复里却能看到图
数据佐证(线上库):
用户在帖子正文和回复里两次都遇到了同样的拦截。回复那条之所以「看起来正常」,是因为:
那条回复的图是在别的时机/旧版 JS 缓存下传成功的(当时 maxCount 还是非 0 值),
正文那条则正好撞上「数量已填 0 + 新 JS」。两边不是不同的代码路径,而是同一 bug 的运气差异。
修法(#4 已包含)
0 视为不限,直接不拦。已确认线上生效:
app.js?v=14,且grep 'maxCount > 0 && countOf(kind) >= maxCount'命中。顺带发现第二个同类陷阱(本次一并修)
同一循环上方:
''.split(',')返回[""],长度是 1,不是 0。所以「允许列表为空」时,
allowed.length判定为真,而indexOf永远 -1 ⇒空列表反而拒绝一切文件(本意应是「不限制格式」)。
实测确认:
当前 UI 没有清空 mimes 的入口,所以现网触发不到,但属于同一类
「空/0 被当成最严格限制」的坑,一并修掉。