编辑extend.php文件
nano /opt/flarum/app/extend.php
将文件内容替换如下
<?php
use Flarum\Extend;
$extenders = [];
// 确保 FoF Upload 插件存在,防止报错
if (class_exists(‘FoF\Upload\File’)) {
// 监听数据库 Eloquent 的底层 saving 事件
// 这发生在插件做完所有的大文件分片、MD5混淆、后缀拼接之后,入库前的最后一刹那
$extenders[] = (new Extend\Event())
->listen('eloquent.saving: FoF\Upload\File', function ($file) {
// $file 就是即将存入数据库的那一行记录
// base_name 控制着前台 BBCode 的展示,以及用户下载时的默认文件名
if ($file && isset($file->base_name)) {
// 强制砍掉结尾的 .bin
$file->base_name = preg_replace('/\.bin$/i', '', $file->base_name);
}
// 注意:我们绝不碰 $file->path,让服务器物理硬盘上保留 .bin,
// 这样既不影响 Flarum 读取真实文件,又能保证前端和下载时绝对没有 .bin!
});
}
return $extenders;
保存文件后进行清理后端并重启,问题即可解决
备注:
FoF Upload 为了防止文件重名,费尽心思生成了 7e68db9d…bin 并保存在了硬盘上(这是它的物理 path)。
但是,当它转身准备把这个记录登记到数据库的 base_name(展示名称)时,我们的拦截器一刀把 .bin 砍了。
结果堪称完美:
数据库里存的 base_name 是无后缀的。
服务器返回给前端浏览器的 API 读取的是无后缀的,因此你帖子里生成的永远是 [upl-file…]…7e68db9d…[/upl-file]!
当其他用户点击下载时,Flarum 会读取硬盘上带 .bin 的真实文件,但是,它会以 base_name(无后缀)作为下载文件名推送给用户!