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

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

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

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

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

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

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

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

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

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

相关推荐
2401_8914092641 分钟前
量化数据13:港股分钟K线、Level2逐笔Tick、十档盘口和港股通历史数据的批量提取
数据库
w-w0w-w7 小时前
SQL注入
网络·数据库·sql
tianyuanwo7 小时前
NetBox 数据库详解:当“关系型数据库”被装进一个网络运维的领域模型里
运维·数据库·netbox
一条泥憨鱼7 小时前
【计算机网络】短连接、长连接与连接池:从 TCP 握手到池化复用的完整链路
网络·数据库·网络协议·tcp/ip·计算机网络
IvorySQL7 小时前
深入 PostgreSQL WAL:从崩溃恢复到逻辑复制
数据库·postgresql
幽灵诶9 小时前
Mysql(基于测试的学习)
数据库·mysql
砚底藏山河9 小时前
python量化自定义周期 K 线合成
java·开发语言·数据库·python·金融
IT召唤狮9 小时前
开源企业级零信任项目Pangolin,零信任能挡住PHP核弹漏洞吗?
开发语言·开源·php
宇宙无敌暴龙战士6669 小时前
MySQL 8 库表操作学习笔记:SQL 基础、库表管理、约束与用户授权全流程
数据库·sql·mysql·学习笔记·后端开发
猿究院_夏燊10 小时前
MySQL 的四种隔离级别
java·数据库·mysql