文件名是中文或带空格,上传成功但点击链接返回 404。乍看像缓存或者权限的锅,追下去往往不是。

$safe = date('Ymd') . '-' . bin2hex(random_bytes(4)) . '.' . $ext;
// 展示名单独存 original_name

追下去是这么回事:原始文件名被直接拼进路径,空格与特殊字符没有处理,链接被截断。

碰到「中文文件名」这类问题,我习惯先把当前配置原样备份一份,改坏了立刻换回来,不用现场推。接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。

偶发问题先统计频率,一小时几次和一天一次,查法完全不同。改完顺手把文档补一句,省得下次自己重新推一遍。

监控和日志的时间要对上,时区不一致会多绕很大一圈。临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。

动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。

具体做法是,保存时使用安全文件名;数据库记录原始名用于展示;下载时再还原显示。

验收就看一点,文件链接可正常访问,下载时显示原始中文名。

作者 9823189