基于目录已有文件实现上传文件的连续数字重命名
自定义连续序列命名的PHP图片上传实现
核心功能实现逻辑
- 仅支持单文件上传,自动以纯数字命名(无前缀后缀)
- 优先填补序列中的缺失数字(如目录存在1、2、4、5时,新文件命名为3)
- 若序列连续,则使用当前最大数字+1作为新文件名
- 可选:上传完成后自动重命名所有文件,强制维持连续序列
修改后的完整代码
<?php $target_dir = "userImages/userID/"; // 确保目标目录存在,不存在则递归创建 if (!is_dir($target_dir)) { mkdir($target_dir, 0755, true); } $uploadOk = 1; $imageFileType = ""; // 验证上传请求与文件类型 if(isset($_POST["submit"])) { $check = getimagesize($_FILES["fileToUpload"]["tmp_name"]); if($check !== false) { echo "文件是图片 - " . $check["mime"] . "."; $imageFileType = strtolower(pathinfo($_FILES["fileToUpload"]["name"], PATHINFO_EXTENSION)); $uploadOk = 1; } else { echo "文件不是图片."; $uploadOk = 0; } } // 文件大小校验 if ($_FILES["fileToUpload"]["size"] > 500000) { echo "抱歉,文件过大."; $uploadOk = 0; } // 允许的图片格式限制 $allowedFormats = ["jpg", "png", "jpeg", "gif"]; if(!in_array($imageFileType, $allowedFormats)) { echo "抱歉,仅允许JPG、JPEG、PNG和GIF格式."; $uploadOk = 0; } // 执行上传逻辑 if ($uploadOk == 0) { echo "抱歉,文件未上传."; } else { // 提取目录中所有纯数字命名的图片文件 $existingFiles = []; $dirIterator = new DirectoryIterator($target_dir); foreach ($dirIterator as $fileinfo) { if (!$fileinfo->isDot()) { $filename = $fileinfo->getFilename(); $namePart = pathinfo($filename, PATHINFO_FILENAME); if (ctype_digit($namePart)) { $existingFiles[] = (int)$namePart; } } } // 查找序列中缺失的最小正整数 sort($existingFiles); $newFileName = 1; foreach ($existingFiles as $num) { if ($num > $newFileName) { break; } $newFileName = $num + 1; } // 拼接目标文件路径 $target_file = $target_dir . $newFileName . "." . $imageFileType; // 执行文件上传 if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) { echo "文件已成功上传,新文件名:" . $newFileName . "." . $imageFileType; // --- 可选:上传后强制重命名所有文件维持连续序列 --- // 取消注释下方代码块即可启用该功能 /* $sortedFiles = []; $dirIterator = new DirectoryIterator($target_dir); foreach ($dirIterator as $fileinfo) { if (!$fileinfo->isDot()) { $sortedFiles[] = $fileinfo->getFilename(); } } sort($sortedFiles); $counter = 1; foreach ($sortedFiles as $file) { $oldPath = $target_dir . $file; $newPath = $target_dir . $counter . "." . pathinfo($file, PATHINFO_EXTENSION); if ($oldPath != $newPath) { rename($oldPath, $newPath); } $counter++; } echo "<br>已重命名所有文件以维持连续序列"; */ } else { echo "抱歉,文件上传失败."; } } ?>
关键代码说明
- 目录自动创建:通过
mkdir递归创建目标目录,避免因目录不存在导致上传失败 - 纯数字文件名筛选:使用
DirectoryIterator遍历目录,提取所有文件名是纯数字的图片文件,存入数组 - 缺失数字查找:对现有数字数组排序后,从1开始遍历,找到第一个缺失的数字作为新文件名;若序列连续,则自动使用最大数+1
- 可选序列强制维护:注释的代码块会在上传完成后,将目录内所有图片重命名为连续数字,适合需要严格序列的场景
内容的提问来源于stack exchange,提问作者DarthCoder
相关产品推荐
相关产品推荐

