Pourquoi mkdir ne fonctionne-t-il pas sans la récursivité définie sur true?

Je sortingpotais mon code, essayant d’écrire du code qui prendrait des données (y compris des images) téléchargées depuis un formulaire via POST, ce qui créerait alors un répertoire complet avec ses sous-répertoires associés pour stocker l’image.

Lors de l’écriture du code, j’ai continué à recevoir l’erreur

Warning: mkdir(): No such file or directory in C:\Users\Admin\Desktop\UniServer\www\AddItem.php on line 94 

Cependant, lorsque je mets la réexpédition de mkdir à true, mkdir fonctionne soudainement et le répertoire est créé sans aucun problème.

Mon code:

 if(isset($_FILES['upload']['tmp_name'])) { $numfile=count($_FILES['upload']['tmp_name']); { for($i=0;$i<$numfile;$i++) { if(is_uploaded_file($_FILES['upload']['tmp_name'][$i])) { //Conditionals for uploaded file $foldername=$_SESSION['UserId']; $cat=$_POST['category']; $sub=$_POST['subcat']; $itemname=$_POST['itemname']; $allowed_filetypes=array('.jpg','.gif','.bmp','.png'); $max_filesize = 2097152; // Maximum filesize in BYTES (currently 2.0MB). $upload_path = 'C:\Users\Admin\Desktop\UniServer\www\images\\'.$foldername.'\\'.$cat.'\\'.$sub.'\\'.$itemname.'\\'; // The place the files will be uploaded to. //Checks if Folder for User exists //If not, A folder for the user is created to store the user's images if(!file_exists($upload_path)) { $upload_path=mkdir($upload_path,0644,true); $max_filesize) { die('The file you attempted to upload is too large.'); } // Check if we can upload to the specified path, if not DIE and inform the user. if(!is_writable($upload_path)) { $errormsg="Image Upload Failed."; } if(!move_uploaded_file($_FILES['upload']['tmp_name'][$i],"$upload_path" . $filename)) { $errormsg= 'Your file upload was successful, view the file here'; // It worked. } } } } } else{echo"Upload failed";} 

Alors que mon code fonctionne maintenant que j’ai défini la récursivité sur true, je ne comprends toujours pas exactement pourquoi il fonctionne, alors j’apprécierais vraiment que quelqu’un puisse expliquer pourquoi mon code fonctionne exactement.

Le plus proche est venu avec Pourquoi mkdir échoue avec l’option récursive définie sur true?

Bien que je ne comprenais rien de ce qui a été dit dans le lien.

Merci!

Le mkdir() besoin du jeu récursif à true car vous lui demandez de créer des répertoires nesteds qui n’existent pas, à savoir:

 $upload_path = 'C:\Users\Admin\Desktop\UniServer\www\images\\'.$foldername.'\\'.$cat.'\\'.$sub.'\\'.$itemname.'\\'; 

Donc, comme la variable $ foldername obtient sa valeur à partir de la session utilisateur, si la session utilisateur change, cela change. La même chose vaut pour le rest des parties $upload_path , si quelque chose change, vous devez créer le chemin complet. Seule la dernière partie du chemin ( $itemname ) peut changer sans utiliser l’option récursive.

Il échoue car il parsing le chemin fourni comme argument et “change” le chemin d’access au parent du nouveau répertoire.

Essayez ceci (dans un test dossier avec un sous-dossier s ):

  • mkdir s/s2/s3 <- échouera car s2 n’existe pas dans s
  • mkdir s/s2 <- ok
  • mkdir s/s2/s3 <- ok

Lorsque vous appelez avec un jeu recursive sur TRUE , il fait quelque chose de différent: divise le chemin comme d’habitude, mais vérifie l’existence de chaque préfixe.

Encore une fois dans le dossier de test :

  • mkdir -ps/s1/s2/s3/s4 donnera les préfixes suivants:
    • s
    • s/s1
    • s/s1
    • s/s1/s2
    • s/s1/s2/s3
    • s/s1/s2/s3/s4

Note: J’ai utilisé mkdir sous linux et l’argument p indique de créer des répertoires parents s’ils n’existent pas (identique à récursif).