Maison  >  Questions et réponses  >  le corps du texte

Renommer séquentiellement les fichiers lors du téléchargement en fonction des fichiers existants dans le répertoire

J'utilise ce code de téléchargement (php) que j'ai trouvé en ligne pour le formulaire de téléchargement d'image.

Je me rends compte qu'il y a déjà beaucoup de questions/réponses sur le site concernant le "renommer les fichiers" lors du téléchargement, et j'ai fait pas mal de recherches à ce sujet.

Jusqu'à présent... aucun d'entre eux ne semble répondre spécifiquement à ce que je veux faire.

J'espère que cela pourra être réalisé en ajustant le code que j'utilise.

À terme... J'aimerais pouvoir télécharger un seul fichier (pas plusieurs) et que les fichiers soient automatiquement nommés avec un simple numéro, par exemple 1, 2, 3, 4 ou 5 etc...

Pas de préfixe et pas d'extension. Juste la valeur numérique du nom.

Cependant, j'aimerais que le code vérifie d'abord le répertoire cible pour analyser quels fichiers "nom" existent déjà.

Donc, si les fichiers existants dans le répertoire sont 1, 2, 3, 4 et 5..., les nouveaux fichiers seront automatiquement nommés 6 dans l'ordre et ainsi de suite.

Cependant, si les fichiers existants dans le répertoire sont 1, 2, 4 et 5 (3 n'existe pas), le nouveau fichier sera téléchargé en tant que 3 pour conserver l'ordre.

Alternativement, pour mes besoins particuliers, cela ne me dérange même pas si toutes les images du répertoire sont renommées lors d'un nouveau téléchargement. Changer essentiellement l’ordre afin que la séquence des nombres soit préservée.

Voici le code de téléchargement que j'utilise actuellement :

<?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粉310931198375 Il y a quelques jours574

répondre à tous(1)je répondrai

  • P粉713866425

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

    Vous pouvez essayer cette fonction, elle vérifiera si les fichiers du répertoire sont nommés consécutivement puis les renommera pour qu'ils soient toujours numérotés, la fonction renvoie le numéro suivant du fichier nouvellement téléchargé

    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;
    }

    Comment mettre en œuvre ?

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

    répondre
    0
  • Annulerrépondre