搜索

首页  >  问答  >  正文

根据目录中的现有文件在上传时顺序重命名文件

我正在使用我在网上找到的这个(php)上传代码作为图像上传表单。

我意识到网站上已经有很多关于上传时“重命名文件”的问题/答案,并且我对它们进行了相当多的研究。

到目前为止......它们似乎都没有具体解决我想做的事情。

希望这可以通过调整我正在使用的代码来实现。

最终...我希望能够上传单个文件(不是多个),并使用简单的数字自动命名文件,例如; 1、2、3、4 或 5 等...

没有前缀,也没有扩展名。只是名称的数值。

但是,我希望代码首先检查目标目录,以扫描哪些文件“名称”已存在。

因此,如果目录中的现有文件为 1、2、3、4 和 5...,新文件将自动按顺序命名为 6,依此类推。

但是,如果目录中的现有文件为 1、2、4 和 5(不存在 3),则新文件将作为 3 上传,以保留顺序。

或者,对于我的特殊需求,我什至不介意目录中的所有图像是否都通过新上传进行重命名。本质上是改变顺序,从而保留数字序列。

这是我当前使用的上传代码:

<?php

$target_dir = "userImages/userID/";

$target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);

$uploadOk = 1;

$imageFileType = strtolower(pathinfo($target_file,PATHINFO_EXTENSION));

// Check if image file is a actual image or fake image

if(isset($_POST["submit"])) {

  $check = getimagesize($_FILES["fileToUpload"]["tmp_name"]);

  if($check !== false) {

    echo "File is an image - " . $check["mime"] . ".";

    $uploadOk = 1;

  
  } else {

    echo "File is not an image.";

    $uploadOk = 0;

  
  }
}

// Check if file already exists

if (file_exists($target_file)) {

  echo "Sorry, file already exists.";

  $uploadOk = 0;
}

// Check file size

if ($_FILES["fileToUpload"]["size"] > 500000) {

  echo "Sorry, your file is too large.";

  $uploadOk = 0;


}

// Allow certain file formats

if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg"

&& $imageFileType != "gif" ) {

  echo "Sorry, only JPG, JPEG, PNG & GIF files are allowed.";

  $uploadOk = 0;


}


// Check if $uploadOk is set to 0 by an error

if ($uploadOk == 0) {

  echo "Sorry, your file was not uploaded.";

// if everything is ok, try to upload file


} else {

  if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {

    echo "The file ". htmlspecialchars( basename( $_FILES["fileToUpload"]["name"])). " has 
been uploaded.";

  } else {

    echo "Sorry, there was an error uploading your file.";

  
  }
}

?>

P粉310931198P粉310931198443 天前680

全部回复(1)我来回复

  • P粉713866425

    P粉7138664252023-09-11 00:41:40

    您可以尝试这个函数,它会检查目录中的文件是否连续命名,然后重命名以使其始终编号,该函数返回新上传文件的下一个编号

    function get_next_file_number($target_dir)  {
    
        $files = scandir($target_dir);
        if (false === $files) {         // If false then is not a directory, you could throw an Exception here
            return -1;
        }
        $counter = 0;
        unset($files[0], $files[1]);    // Delete the . and .. from array
        natsort($files);                // Important! Sort file names naturally
        foreach ($files as $file) {
            ++$counter;
            $file_info = pathinfo($file);
            $file_name = $file_info['filename'];
            $extension = $file_info['extension'];
            if ($file_name != $counter) {
                $old_name = $target_dir . DIRECTORY_SEPARATOR . $file;
                $new_name = $target_dir . DIRECTORY_SEPARATOR . $counter . "." . $extension;
                if (!file_exists($new_name)) {
                    rename($old_name, $new_name);
                }
                else {
                    // Oops trying to rename to a file that already exists, this shouldn't happen!
                }
                //echo "renamed: " . $old_name . " to " . $new_name, "<br>";
            }
        }
        return $counter + 1;
    }

    如何实现?

    // .....
    // You can check the returned value, if it is -1 you know there was an error
    $next_number = get_next_file_number($target_dir);
    $new_target_file = $target_dir . $next_number . "." . $imageFileType;
    // Here you can make sure the file does not exists... just to make sure...
    // Here move the uploaded file with the next number
    if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $new_target_file)) {
        echo "The file ". htmlspecialchars( basename( $_FILES["fileToUpload"]["name"])). " has been uploaded.";
    }
    // .....

    回复
    0
  • 取消回复