通用附件上传:白名单、大小限制与可设价格的三层校验
照着这篇配一遍,你就能把 Clara BBS 的附件上传配成「只放行该放行的格式、只接受该接受的体积、还能让附件单独卖钱」的三层闭环。
第一步:先弄清三层校验各管什么
附件从用户点上传到别人下载,一共过三道关,顺序固定:
- 类型层——扩展名白名单,管"允许传什么格式"
- 体积层——PHP 与目录,管"多大能传上去"
- 权限层——价格与下载权限,管"谁能下、要不要付费"
前两层是技术准入,配错了用户根本传不上来;第三层是运营策略,配错了要么白送要么没人买。分开理解,排查时才知道该去哪个页面。
注意:后台的"允许的扩展名"管图片,"附件允许的扩展名"管附件,是两个独立字段。只改了其中一个,另一类文件照样传不上——这是最常见的误判。
第二步:配第一层,附件扩展名白名单
入口:后台「系统设置→上传限制」。
把确实要放行的格式写进"附件允许的扩展名",例如 zip、rar、7z、pdf、docx、xlsx、apk 等,用逗号分隔。系统对上传文件做类型白名单校验,不在名单里的直接拒收,不存在"猜一猜能不能过"的模糊地带。
注意:上传失败时页面会提示具体原因(白名单不符 / 超过 PHP 上限 / 目录不可写),照着提示改就行,不用反复试。
注意:改动保存即生效,不需要清缓存。配完立刻用一个白名单外的格式试一次,确认真的被拦住。
第三步:配第二层,体积上限
体积卡在两个地方,缺一不可。
PHP 层:upload_max_filesize 和 post_max_size。宝塔面板默认 2M,手机拍一张照片就超了,建议至少调到 30M 以上,改完重载 PHP。
目录层:uploads 目录必须可写,否则文件通过了所有校验也落不了盘。
注意:
post_max_size必须大于等于upload_max_filesize。只调大后者,大文件会在表单提交阶段就被截断,报错信息比"文件太大"更让人摸不着头脑。
注意:允许的扩展名再全,PHP 上限不放开,结果还是传不上。这两处要一起改。
第四步:配第三层,价格与下载权限
第三层不在后台,而在发帖页的附件面板里,边传边设:
- 上传附件,等它出现在面板列表里
- 设置价格与货币——填
0表示免费,填正数即为付费附件 - 选择下载权限——所有人 / 会员 / 指定用户组
附件交易和转账、签到、悬赏、礼物共用系统统一的记账体系,账目口径一致。
不打算占服务器存储的,可以切到网盘链接模式:只填网盘链接和提取码,文件放在第三方网盘上。这种模式不参与本地体积校验,但价格与下载权限照样可以设,运营逻辑和本地附件完全一致。
注意:价格要填数字
0才是免费,配付费附件时先想清楚面向谁——面向所有游客开放下载,就等于公开分享。
第五步:三种账号各验一遍
配完别急着上线,按这个清单跑一遍:
- 传一个白名单外格式 → 应被拒绝
- 传一个超过 PHP 上限的文件 → 应提示超过上限
- 传一个正常附件并标价 → 用另一个普通账号打开帖子,确认出现购买入口
- 把下载权限设为"指定用户组" → 用组外账号确认无法下载
四项都符合预期,三层校验就算配到位了。
小结
- 三层各管一段:扩展名白名单管类型,PHP + 目录管体积,价格与权限管下载。
- 图片和附件的扩展名白名单是两个独立字段,别只改一个。
post_max_size要 ≥upload_max_filesize,uploads 目录必须可写。- 附件价格在发帖页的附件面板里设,
0为免费;下载权限可选所有人 / 会员 / 指定用户组。 - 网盘链接模式不占服务器存储,但同样可设价格与权限。
- 所有设置保存即生效,无需清缓存;上传失败会提示具体原因,按提示排查最快。
转载请注明出处,版权归原作者所有。
星耀SVIP
管理员
黑卡会员






