search

Home  >  Q&A  >  body text

Sequentially rename files on upload based on existing files in directory

I'm using this (php) upload code I found online for the image upload form.

I realize there are already a lot of questions/answers on the site about "renaming files" when uploading, and I've done quite a bit of research on them.

So far...none of them seem to specifically address what I want to do.

Hopefully this can be achieved by adjusting the code I'm using.

Ultimately...I would like to be able to upload a single file (not multiple) and have the files automatically named with a simple number, eg; 1, 2, 3, 4 or 5 etc...

No prefix and no extension. Just the numerical value of the name.

However, I would like the code to first check the target directory to scan which files "name" already exist.

So if the existing files in the directory are 1, 2, 3, 4 and 5..., the new files will automatically be named 6 in sequence, and so on.

However, if the existing files in the directory are 1, 2, 4 and 5 (3 does not exist), the new file will be uploaded as 3 to preserve the order.

Or, for my particular needs, I don't even mind if all images in the directory are renamed with a new upload. Essentially changing the order so that the sequence of numbers is preserved.

This is the upload code I'm currently using:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

<?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粉310931198561 days ago808

reply all(1)I'll reply

  • P粉713866425

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

    You can try this function, it will check if the files in the directory are named consecutively, and then rename them so that they are always numbered, the function returns the next number of the newly uploaded file

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    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;

    }

    How to achieve?

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    // .....

    // 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.";

    }

    // .....

    reply
    0
  • Cancelreply