PHP上传文件为什么会被覆盖

最近排查一个 PHP 后台时遇到过这种情况:用户连续上传两份文件,页面都提示成功,但最后服务器目录里只剩下一份。数据库记录有两条,下载时却都指向同一个文件。

继续看上传代码后发现,程序直接使用了用户原始文件名保存。

如果两个人上传的文件都叫 合同.pdf,或者同一个用户重复上传同名文件,后上传的文件就可能把前一个文件直接覆盖。尤其是合同、客户附件、报表这类文件,原始文件名重复其实非常常见。

后来把文件保存规则改成由系统生成唯一名称,不再直接使用用户上传的名字。例如通过业务编号、时间、随机字符串组合生成实际存储文件名,原始文件名只保存到数据库,用来展示给用户。

同时在数据库中记录文件路径、原文件名、文件大小、扩展名和上传时间。真正下载时通过文件 ID 查询路径,而不是根据文件名拼接地址。

对于覆盖上传的业务,也单独设计版本逻辑,明确是新增文件还是替换旧文件,避免两种操作共用同一套保存方式。

现在做 PHP 文件上传时,我一般会把"用户看到的文件名"和"服务器实际保存的文件名"分开处理。

文件上传成功不代表文件管理就安全。命名规则如果没有提前设计好,后期很容易出现覆盖、找错文件甚至历史附件丢失的问题。

#PHP开发 #文件上传 #后台系统 #文件管理

相关推荐
SelectDB技术团队1 小时前
VARIANT 列接入网关 JSON 日志:建表、导入、子列查询与物化的完整步骤
大数据·数据库·人工智能·elasticsearch·搜索引擎·json·apache doris
涛思数据(TDengine)1 小时前
TDengine IDMP 2.0.2 发布:元素关系可视化、数据建模与联邦查询三大升级
大数据·数据库·人工智能·时序数据库·tdengine·工业互联网·工业ai
小米里的大麦1 小时前
17 MySQL 视图
数据库·mysql
ss2731 小时前
PG实战笔记 | 07 PostgreSQL常见编译项及其作用
数据库·笔记·postgresql
川石课堂软件测试1 小时前
自动化测试|持续集成Git使用详解
git·python·jmeter·mysql·ci/cd·容器·kubernetes
丨白色风车丨1 小时前
LangChain 1.0 核心用法速查:创建模型、创建 Agent、调用
数据库·langchain
临床数据科学和人工智能兴趣组2 小时前
正则表达式的基础语法的常用字符类
数据库·r语言·r语言-4.2.1·临床研究·临床试验
鱼很腾apoc2 小时前
【MySQL】 第2期 查询与函数系统详解:从基础 CRUD 到复合多表查询
linux·数据库·学习·mysql·dml
IMPYLH2 小时前
Linux 运维基础:从入门到实战的完整指南
linux·运维·php