PHP上传文件未更新时沿用旧记录文件扩展名的实现方案是什么?
问题解决
现有代码问题
- 变量拼写错误:else分支中
$rnew["File"]应为$rsnew["File"],变量名写错导致赋值不生效 - 上传判断逻辑不严谨:仅判断文件大小为0无法覆盖上传出错、文件字段未提交的场景,容易出现异常
- 缺少空值兼容:如果是首次新增记录没有旧文件数据时,
$ext2会为空,没有做兜底处理
修正后代码
// 初始化默认扩展名为空 $ext = ''; // 判断是否有正常上传的新文件 if (isset($_FILES["File"]) && $_FILES["File"]["error"] == UPLOAD_ERR_OK) { // 取新上传文件的扩展名 $ext = pathinfo($rsnew["File"], PATHINFO_EXTENSION); } else { // 没有新文件上传,优先取旧记录的扩展名 if (!empty($rsold["File"])) { $ext = pathinfo($rsold["File"], PATHINFO_EXTENSION); } // 可选:如果是新增场景没有旧文件,可以在这里加兜底逻辑,比如设置默认扩展名或者抛出错误 // if (empty($ext)) { // throw new \Exception('请上传文件'); // } } // 统一生成文件名,避免重复代码 $rsnew["File"] = "{$rname} {$docpath1} {$docpath2} {$docpath} ID{$randomNumber}.{$ext}"; // 新文件上传的场景可以在这里加你原来的return逻辑,根据业务调整 // if (isset($_FILES["File"]) && $_FILES["File"]["error"] == UPLOAD_ERR_OK) { // return true; // }
逻辑说明
- 用PHP内置的上传错误码
UPLOAD_ERR_OK判断文件是否上传成功,比判断文件大小更准确,覆盖了所有正常上传的场景 - 扩展名取值优先级:新上传文件扩展名 > 旧记录文件扩展名 > 兜底自定义逻辑
- 文件名生成逻辑统一写一处,避免重复代码后续修改出错
内容的提问来源于stack exchange,提问作者Christ2000
相关产品推荐
相关产品推荐

