Gestion d'images en PHP

Alexandre31000 Messages postés 6 Statut Membre -  
Alexandre31000 Messages postés 6 Statut Membre -
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. Boa
     
    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
  2. Alexandre31000 Messages postés 6 Statut Membre
     
    Il y a trop de sources, je ne trouve pas de solutions...quelqu'un pour m'éclairer la lanterne ?

    Merci à vous !
    0
  3. Alexandre31000 Messages postés 6 Statut Membre
     
    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
    0
  4. Boa
     
    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 !
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Alexandre31000 Messages postés 6 Statut Membre
     
    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 !
    0
  7. Alexandre31000 Messages postés 6 Statut Membre
     
    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 !
    0
  8. Boa_67 Messages postés 3 Statut Membre
     
    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é.
    0
  9. Alexandre31000 Messages postés 6 Statut Membre
     
    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...
    0