
最近排查一个 PHP 后台时遇到过这种情况:用户连续上传两份文件,页面都提示成功,但最后服务器目录里只剩下一份。数据库记录有两条,下载时却都指向同一个文件。
继续看上传代码后发现,程序直接使用了用户原始文件名保存。
如果两个人上传的文件都叫 合同.pdf,或者同一个用户重复上传同名文件,后上传的文件就可能把前一个文件直接覆盖。尤其是合同、客户附件、报表这类文件,原始文件名重复其实非常常见。
后来把文件保存规则改成由系统生成唯一名称,不再直接使用用户上传的名字。例如通过业务编号、时间、随机字符串组合生成实际存储文件名,原始文件名只保存到数据库,用来展示给用户。
同时在数据库中记录文件路径、原文件名、文件大小、扩展名和上传时间。真正下载时通过文件 ID 查询路径,而不是根据文件名拼接地址。
对于覆盖上传的业务,也单独设计版本逻辑,明确是新增文件还是替换旧文件,避免两种操作共用同一套保存方式。
现在做 PHP 文件上传时,我一般会把"用户看到的文件名"和"服务器实际保存的文件名"分开处理。
文件上传成功不代表文件管理就安全。命名规则如果没有提前设计好,后期很容易出现覆盖、找错文件甚至历史附件丢失的问题。
#PHP开发 #文件上传 #后台系统 #文件管理