You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于目录已有文件实现上传文件的连续数字重命名

自定义连续序列命名的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 20:42:18