IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Parcour répertoires pour modifications, erreur sur NATSORT pas d'array ? [PHP 5.6]


Sujet :

Langage PHP

  1. #1
    Membre éprouvé
    Avatar de JPBruneau
    Homme Profil pro
    retraité
    Inscrit en
    Août 2019
    Messages
    204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : retraité
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2019
    Messages : 204
    Points : 918
    Points
    918
    Par défaut Parcour répertoires pour modifications, erreur sur NATSORT pas d'array ?
    Bonjour les Amis,
    J'ais un outil simple qui marche, sauf que mon PHP me dit que NATSORT s'applique à un Array, je croyait que s'en était un ??

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    <?PHP
    header('Content-type: text/html; charset=65001'); 
    ?>
    <!DOCTYPE html> 
    <html lang='fr'>   
    <head>
    <meta charset="65001">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <!--[if IE]>
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <![endif]-->
    </head>
    <body>
    <?php
     
    function liste_dos($nom)
    {
        echo "<br /><b>==".$nom."==</b><br />";
        if ($dir = opendir($nom))
        {
            natsort($dir);  
            while ($file = readdir($dir))
            {
                if (!($file == '.' || $file == '..'))
                { 
                 $garde=0;
                 $flag=strpos($file, ".jpg") ;
                 if ($flag >0 ) $garde=99; 
                 if ($garde==99)
                  { 
                    $work=$file;
                    $work=str_replace(" ","-",$work);
                    $work=str_replace("_","-",$work);
                    $work=str_replace("--","-",$work);
                    $work=str_replace("--","-",$work);
                    $old=$nom."\\".$file;
                    $new=$nom."\\".$work;
                    rename($old,$new);
                    echo "".$file."--".$work." <br> "; 
                  }
                }
            }
            closedir($dir);
        }
    }
     
    liste_dos('albums2v/11_dessinv/');
     
    ?>
    </body></html>
    Voila ça doit sauter aux yeux mais moi je n'ai pas trouvé ???
    Merci pour l'aide

  2. #2
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 200
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 200
    Points : 8 425
    Points
    8 425
    Billets dans le blog
    17
    Par défaut
    opendir() ne retourne pas un tableau mais une ressource.

    Pour avoir un tableau tu peux utiliser glob() ou scandir() ou placer tes entrées dans un tableau.

  3. #3
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 389
    Points : 10 422
    Points
    10 422
    Par défaut
    Salut,

    Tu peux aussi utiliser DirectoryIterator qui dispose de tout un tas de propriétés intéressantes. Un exemple documenté dans le code :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    <?php
    function liste_dos($nom)
    {
        if (is_dir($nom))
        {
    		// Si plusieurs remplacements il est préférable de passer un tableau dans str_replace.
    		$cible=[" ","_"];
    		$remplacement = '-'; // pourrait aussi être un tableau mais ici tous les éléments de $cible sont à remplacer par le même caractère.
     
    		$tab_fich = [];
     
    		// On utilise DirectoryIterator pour lister le dossier
    		$iterator = new DirectoryIterator($nom);
    		foreach ($iterator as $fileinfo) 
    		{
    			// Si c'est un fichier ayant une extension jpg ou JPG
    			if ($fileinfo->isFile() && mb_strtolower($fileinfo->getExtension()) == 'jpg') 
    			{
    				// getFilename() retourne le nom du fichier. $count comptera le nombre de remplacements
    				$work = str_replace($cible,$remplacement,$fileinfo->getFilename(),$count);
     
    				// supprime les occurrences successives de '-'. $countp comptera le nombre de remplacements
    				$work = preg_replace('#-{2,}#','-',$work, -1, $countp);
     
    				// si un remplacement a été effectué on renomme le fichier
    				if($count || $countp)
    				{
    					// Renomme le fichier. getPathname() retourne le chemin du fichier (dossier+nom), getPath() retourne le nom du dossier
    					rename($fileinfo->getPathname(),$fileinfo->getPath().DIRECTORY_SEPARATOR.$work);
    				}
     
    				// Si tu veux faire afficher les anciens noms et les nouveaux on utilise un tableau associatif
    				$tab_fich[$work] = $fileinfo->getFilename();
    			}
    		}
     
    		// tri sur les clés, ordre naturel
    		ksort($tab_fich, SORT_NATURAL);
     
    		// Si tu souhaites n'afficher que les 100 premiers éléments du tableau
    		$tab_fich = array_slice($tab_fich, 0, 100, true);
     
    		// Et on liste le résultat
                    echo "<br><b>==".$nom."==</b><br>";
    		echo '<table>';
    		foreach ($tab_fich as $work => $old)
    		{
    			echo '<tr>';
    			//→ affiche une flèche
    			echo '<td>'.$old.'</td><td>→</td><td>'.$work.'</td>';
    			echo '</tr>';
    		}
    		echo '</table>';
        }
    }
     
    liste_dos('albums2v/11_dessinv/');
    ?>
    Attention si tu lances cette fonction tous tes fichiers ayants une extension jpg dans 'albums2v/11_dessinv/' seront renommés en remplaçant " " et "_" par "-" et toutes les occurrences successives de "-" seront remplacées par un seul "-". Les 100 premiers résultats seront affichés.

    Cela dit, si c'est en local ça va, par contre sur un serveur distant si tu laisses uploader des fichiers par des visiteurs sans contrôler leur noms tu peux t'exposer à de sérieux problèmes. Pour dire qu'en cas d'upolad de fichiers vers le serveur les remplacements et les contrôles se font lors de l'upload ou avant et non pas plus tard.

  4. #4
    Membre éprouvé
    Avatar de JPBruneau
    Homme Profil pro
    retraité
    Inscrit en
    Août 2019
    Messages
    204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : retraité
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2019
    Messages : 204
    Points : 918
    Points
    918
    Par défaut
    Mille mercis à vous !!
    C'est trop bien le Topo de ABCIWEB j'ai trouvée plein de trucs à garder .
    Séb. j'optes pour ta solution c'est super efficace et simple à mettre en jeux.

    A bientôt

  5. #5
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 389
    Points : 10 422
    Points
    10 422
    Par défaut
    Citation Envoyé par JPongivart Voir le message
    Séb. j'optes pour ta solution c'est super efficace et simple à mettre en jeux.

    A bientôt
    Oui c'est un bon choix puisque la fonction glob permet de configurer directement un tri sur les extensions de fichiers tout en les classant par défaut par ordre alphabétique. J'ai voulu montrer "DirectoryIterator" car cette classe offre un accès direct à un maximum d'informations sur les fichiers mais dans ton cas tu peux utiliser pathinfo. Je parle de pathinfo car c'est avec cette fonction que l'on trouve entre autre l'extension d'un fichier et non pas avec "strpos" comme tu le faisais précédemment. En effet "abc.jpgtoto.png" est un nom de fichier tout a fait valide mais qui serait reconnu comme un fichier jpg avec strpos($file, ".jpg").

    Il faut aussi penser que les extensions de fichiers peuvent être en minuscules ou en majuscules. De même les fichiers "jpeg" sont équivalents aux fichiers "jpg". Pour traiter ces différents cas avec glob tu peux faire glob($dossier."*.{jpg,JPG,jpeg,JPEG}", GLOB_BRACE);. Je dis cela au cas où, car souvent on fait des tests sur son répertoire mais cela couvre rarement tous les cas de figures et l'on s'aperçoit parfois beaucoup plus tard que le script ne fonctionne pas sans savoir pourquoi.

    Citation Envoyé par JPongivart Voir le message
    Mille mercis à vous !!
    C'est trop bien le Topo de ABCIWEB j'ai trouvée plein de trucs à garder .
    J'ai vu que tu galérais avec tes "str_replace". Par ailleurs "preg_replace" est le moyen le plus sûr pour supprimer deux occurrences successives d'un caractère. Les $count sont aussi pratiques pour exécuter du code suivant que des remplacements ont été effectués ou non. Je connais bien ces problèmes et le travail sur les fichiers pour avoir développé ce module d'upload disponible ici

    Tu peux t'en servir si besoin car il est adapté aussi bien pour les upload basiques que pour des upload beaucoup plus complexes. L'avantage est que même pour un upload basique on dispose de fonctionnalités avancées, avec le retour d'information en temps réel, le contrôle du type MIME et des extensions, la sécurisation du script par un token, la gestion des erreurs fatales du serveur, tout en surpassant les configurations serveur "upload_max_filesize", "post_max_size" et "max_file_uploads", donc sans limite de taille ni du nombre de fichiers. Il est également optimisé avec une consommation de mémoire toujours inférieure à 1Mo quelque soit la taille du fichier. Comparativement, la fonction classique "move_uploaded_file" que l'on voit souvent dans les tutos a une consommation mémoire directement proportionnelle à la taille du fichier soit environ 64Mo pour un fichier de 64Mo par exemple. Et évidemment par défaut, le script utilise une fonction de nettoyage du nom des fichiers un peu comme celle que tu veux mettre en place dans ton script.

    C'est complet et prêt à l'emploi, suffit de dézipper le dossier et de le placer sur son serveur pour faire les premiers tests et uploader des fichiers. Je t'en parle car de nombreux exemples sont spécifiquement dédiés au traitement d'image à la volée lors de l'upload, avec des possibilité de redimensionnements successifs, de recadrage (crop) avant upload, création de différents albums photo avec vignette et image grand format, il y a aussi des exemples de notation de fichiers, et toutes ces fonctionnalités sont compatibles avec un upload multiple. Ce module prêt à l'emploi peut rendre des services en évitant beaucoup de travail.

    Allez, bonne continuité

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Erreur sur création d'un Array - valeur undefined
    Par Farmer64 dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 11/05/2020, 18h19
  2. [12c] Erreur sur FK pas tracée par Oracle?
    Par Ikebukuro dans le forum Administration
    Réponses: 3
    Dernier message: 03/12/2017, 16h14
  3. [CS5] aide pour une erreur sur une page
    Par tfranc dans le forum Dreamweaver
    Réponses: 4
    Dernier message: 07/12/2012, 22h44
  4. Erreur sur champ text pour un index Full-Text
    Par Steph82 dans le forum Outils
    Réponses: 5
    Dernier message: 06/01/2011, 14h08
  5. Réponses: 7
    Dernier message: 12/08/2005, 09h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo