Gestion d'images en PHP

Bonjour,

J'ai réalisé une gestion d'images en PHP qui permet d'ajouter une image dans un dossier "images", et qui permet ensuite de l'afficher sur une page.
Cependant, j'ai 3 aspects que je n'arrive pas à résoudre :

- faire en sorte que la dernière image postée apparaissent en premier (avec un système de trie ?) ;
- pouvoir uploader des images avec des accents, espaces et numéros (car l'image ne s'affiche pas si le nom du fichier comporte tout cela);

- et enfin limiter le nombre d'images par page !

Cela fait beaucoup, mais j'avoue que je suis encore débutant pour me débrouiller tout seul ...
Merci beaucoup pour vos éventuelles réponses !

Je peux éventuellement poster des bribes de script pour plus de clarté !

8 réponses

  1. Hello !

    Tu as dû mal programmer à un moment, notamment pour les accents qui ne passent pas.

    Des pistes :
    - Encode toujours tes fichiers en utf-8 (sans bom)
    - Utilise notepad++ pour éditer tes programmes (pour modifier l'encodage facilement)
    - Sépare toujours bien ton html de ton php, sinon ça devient vite laid

    Pour trier par ordre d'upload, plusieurs pistes également :
    - utilise la date de création du fichier (cf. filemtime : http://php.net/manual/fr/function.filemtime.php )
    OU
    - compte le nombre d'images déjà présentes, et préfixe le nom de l'image à uploader par ce chiffre. Du coup chaque image sera numérotée.
    OU
    - Utilise une base de données, où tu pourras par la suite stocker plus d'infos liées aux images (qui a rajouté l'image par exemple), en plus de la date d'ajout.

    Bref c'est assez varié.

    Pourrai-je voir le code HTML généré pour l'affichage de ces images? Notamment le cas où il y a un espace, un accent, etc.

    Bon courage !
    1. Il y a trop de sources, je ne trouve pas de solutions...quelqu'un pour m'éclairer la lanterne ?

      Merci à vous !
      1. Bonsoir Boa,
        tout d'abord merci pour ta réponse rapide !
        Pour l'encodage j'avais essayé mais sans succès (j'ai trouvé un bout de code

        $nom = strtr($nom,'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ','AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
        $nom = preg_replace('/([^.a-z0-9]+)/i', '-', $nom);

        mais je ne sais pas où le placer...

        Voilà donc mes deux pages php ==> accueil.php (là où je charge et affiche les images) et ensuite imgClass.php (là où les fonctions opèrent)

        accueil.php

        <?php
        if(!empty($_FILES)){
        require("imgClass.php");
        $img = $_FILES['img'];
        $ext = strtolower(substr($img['name'],-3));
        $allow_ext = array("jpg",'png','gif');
        if(in_array($ext,$allow_ext)){
        move_uploaded_file($img['tmp_name'],"images/".$img['name']);
        Img::creerMin("images/".$img['name'],"images/min",$img['name'],215,112);
        Img::convertirJPG("images/".$img['name']);
        }
        else{
        $erreur = "Votre fichier n'est pas une image";
        }

        }

        ?>
        <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
        <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
        <head>
        <title>GEOFFREY PERALES | Portfolio</title>
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
        <link rel="icon" type="image/png" href="../../img/favicon.png" />
        <link rel="stylesheet" media="screen" type="text/css" title="Design" href="../../design.css" />
        <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
        <!-- TinyMCE -->
        <script type="text/javascript" src="../../Javascript/tiny_mce/tiny_mce.js"></script>
        </head>

        <body>

        <div id="corps">

        <h3>Ajoute tes créations ici !</h3>

        <?php
        if(isset($erreur)){
        echo $erreur;
        }

        ?>
        <form method="post" action="accueil.php" enctype="multipart/form-data">
        <input type="file" name="img"/>
        <input type="submit" name="Envoyer"/>
        </form>
        <br/><br/>

        <?php
        $dos = "images/min";
        $dir = opendir($dos);
        while($file = readdir($dir)){
        $allow_ext = array("jpg",'png','gif');
        $ext = strtolower(substr($file,-3));
        if(in_array($ext,$allow_ext)){
        ?>
        <div class="min">
        <a href="images/<?php echo $file; ?>" class="zoombox zgallery">
        <img src="images/min/<?php echo $file; ?>"/>
        </a>
        </div>
        <p><a href="suppr_accueil.php?file=<?php echo $file; ?>">supprimer image</a></p><br /> <br /> <br/><br /> <br/>
        <?php
        }
        }
        ?>

        </div><!-- fin de la div corps -->

        </div> <!-- fin de div page-->
        </body>
        </html>

        et imgClass.php

        <?php

        class Img{

        function creerMin($img,$chemin,$nom,$mlargeur=100,$mhauteur=100){
        // On supprime l'extension du nom
        $nom = substr($nom,0,-4);
        // On récupère les dimensions de l'image
        $dimension=getimagesize($img);
        // On cré une image à partir du fichier récup
        if(substr(strtolower($img),-4)==".jpg"){$image = imagecreatefromjpeg($img); }
        else if(substr(strtolower($img),-4)==".png"){$image = imagecreatefrompng($img); }
        else if(substr(strtolower($img),-4)==".gif"){$image = imagecreatefromgif($img); }
        // L'image ne peut etre redimensionne
        else{return false; }

        // Création des miniatures
        // On cré une image vide de la largeur et hauteur voulue
        $miniature =imagecreatetruecolor ($mlargeur,$mhauteur);
        // On va gérer la position et le redimensionnement de la grande image
        if($dimension[0]>($mlargeur/$mhauteur)*$dimension[1] ){ $dimY=$mhauteur; $dimX=$mhauteur*$dimension[0]/$dimension[1]; $decalX=-($dimX-$mlargeur)/2; $decalY=0;}
        if($dimension[0]<($mlargeur/$mhauteur)*$dimension[1]){ $dimX=$mlargeur; $dimY=$mlargeur*$dimension[1]/$dimension[0]; $decalY=-($dimY-$mhauteur)/2; $decalX=0;}
        if($dimension[0]==($mlargeur/$mhauteur)*$dimension[1]){ $dimX=$mlargeur; $dimY=$mhauteur; $decalX=0; $decalY=0;}
        // on modifie l'image crée en y plaçant la grande image redimensionné et décalée
        imagecopyresampled($miniature,$image,$decalX,$decalY,0,0,$dimX,$dimY,$dimension[0],$dimension[1]);
        // On sauvegarde le tout
        imagejpeg($miniature,$chemin."/".$nom.".jpg",90);
        return true;
        }
        function convertirJPG($img){
        // On cré une image à partir du fichier récup
        if(substr(strtolower($img),-4)==".jpg"){$image = imagecreatefromjpeg($img); }
        else if(substr(strtolower($img),-4)==".png"){$image = imagecreatefrompng($img); }
        else if(substr(strtolower($img),-4)==".gif"){$image = imagecreatefromgif($img); }
        // L'image ne peut etre redimensionne
        else{return false; }
        imagejpeg($image,substr($img,0,-3)."jpg",90);
        }
        }

        ?>

        Encore merci ! Je vais regarder pour tes conseils pour l'instant ! Bonne nuit
        1. Une autre piste rapide : Vu que tu passes les noms de fichiers dans les liens, en GET, je te conseille d'encoder le nom du fichier en URL avec urlencode() : http://www.php.net/manual/fr/function.urlencode.php

          Le PHP ne gère l'utf-8 et les caractères spéciaux que récemment. Ainsi à la place d'utiliser substr, par exemple, il faudra utiliser mb_substr : http://www.php.net/manual/fr/function.mb-substr.php Et en haut de ton script il faudra définir l'encodage : http://www.php.net/manual/fr/function.mb-internal-encoding.php Vérifie que chaque fonction manipulant les chaînes de caractère est bien compatible en utf-8.

          Il peut aussi être utile de supprimer directement les caractères spéciaux, vu que le nom de fichier ne pourra par exemple jamais comporter '/' ou ':'. Une simple regex du genre preg_replace('/[^a-zA-Z0-9_-]/', '_', $fichier) pourra suffire.

          Mais il est quand même bon de savoir utiliser les accents, tu les rencontreras dans bien d'autres cas. =)

          bonne nuit !
          1. J'ai essayé tes pistes mais j'avoue que je rame un peu.
            L'utf-8 est bien configuré (je code sur Smultron)

            Finalement, je ne sais pas où il faut placer les fonctions urlencode, le preg_replace, etc. Sur accueil.php ou sur imgClass ?

            Encore merci !
            1. J'ai trouvé pour tout ce qui est de l'encodage, c'était une faute de frappe...

              Il me reste encore la pagination de 3 images par pages et faire apparaitre la dernière image postée en début de liste.

              S'il y a quelqu'un, merci !
              1. Si tu fais de l'utf-8 modifie aussi le charset :
                <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />

                deviendra
                <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

                Pour preg_replace, met le sur le nom de l'image, une fois au départ, par exemple directement dans $img['name']
                $img['name'] = preg_replace('/[^a-zA-Z0-9_-]/', '_', $img['name']);

                Urlencode est à placer sur les url, donc par exemple autour de $file ici :
                <img src="images/min/<?php echo $file; ?>"/>

                ou ici

                href="images/<?php echo $file; ?>"

                Il doit y avoir d'autres endroits, je n'ai pas vérifié.
                1. Je viens de modifier ça et effectivement ça marche ! le charset a enlever les caracteres sur l'ensemble de la page.

                  Je continue sur le reste, merci Boa, toujours présent malgré mes lacunes...