• STATISTIQUES
  • Il y a eu un total de 0 membres et 17385 visiteurs sur le site dans les dernières 24h pour un total de 17 385 personnes!
    Membres: 2 435
    Discussions: 3 585
    Messages: 32 832
    Tutoriels: 78
    Téléchargements: 38
    Sites dans l'annuaire: 58


  • ANNUAIRE
  • [FR] Le site du zero
    Découvrez gratuitement la programmation (C, C++, PHP, MySQL, XHTML, CSS...), Linux, le Mapping, la modé...
    Programmation
    [FR] InfoMirmo
    Apprentissage de l'informatique par l'intermédiaire de challenges de sécurité. Venez app...
    Hacking
    [EN] phrack
    Lot's of stuff !
    Hacking
    [FR] Zenk-Security
    La communauté zenk-security a pour objet principal la sécurité informatique, nous sommes des tou...
    Hacking
    [EN] Defcon
    Lancé en 1992 par Dark Tangent, DEFCON est la plus ancienne et la plus grande conférence underground de...
    Hacking
    [FR] Forum-Webmaster
    Une communauté webmaster pour apporter / recevoir de l'aide en création de site internet. Webmaster...
    Webmaster
    [FR] Comment ca marche
     Gratuit et accessible à tous, ce site de communauté permet de se dépanner, se faire aider ...
    Webmaster

  • DONATION
  • Si vous avez trouvé ce site internet utile, nous vous invitons à nous faire un don du montant de votre choix via Paypal. Ce don servira à financer notre hébergement.

    MERCI!




Note de ce sujet :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5
[Php] Thumbnail sur mesure par htaccess et librairies php GD
17-06-2011, 04h18 (Modification du message : 19-11-2012, 19h19 par InstinctHack.)
Message : #1
CyberSee Hors ligne
Admin fondateur de N-PN
*******



Messages : 1,721
Sujets : 287
Points: 158
Inscription : Jan 2012
[Php] Thumbnail sur mesure par htaccess et librairies php GD
Salut tout le monde :-)
Dernièrement, dans un des sites que j’ai faits pour une photographe, j’ai dû mettre sur pied un système qui permet de réduire les photos automatiquement ... Au début, j'avais pensée créée 3 images pour chaque upload ... Une version petite, une version grande plus l'original. Sauf que la cliente en question en avait, plus de 500 à uploadé. Donc histoire d'utiliser moin d'espace j’ai changé ma stratégie.

J’ai mis sur pied un système qui permet de fabriquer des versions miniaturiser appartir de l'original en utilisant la librairie GD ce qui permet d'uploader seulement qu'une seule fois l'image puis avoir n'importe quelle grandeur compresser a soin pour une ouverture plus rapide de la page et tout cela sur demande a partir de l'original.

Fichier: image.php
Code PHP :
<?
    
    // Fichier ou ce trouve tout les images
    $fichier = "media/original";

    // Une erreur c'est produit... on l'affiche
    function diewith($msg) {
        header("HTTP/1.0 500 Internal error."); // On change le header pour pouvoir afficher le message
        echo $msg;
        die;
    }

    // On récupère les variables passer en GET
    $uri = $_REQUEST['uri'] or diewith("Manque l'URL de l'image");
    $inWidth = $_REQUEST['w'];
    $inHeight = $_REQUEST['h'];
    $method=$_REQUEST['method'];
    
    // Ou essaye d'ouvrir l'image
    $srcTime = @filemtime($uri) or diewith("Impossible d'ouvrir l'image");
    $reqTimeStr = isset($_SERVER['HTTP_IF_MODIFIED_SINCE']);

    // On vérifie si la date du cache est a jour
    if ((! empty($reqTimeStr)) and ($srcTime <= strtotime($reqTimeStr))) {
        header("HTTP/1.1 304 Not modified");
        exit;
    } else {
        header("Last-Modified: " . date('r', $srcTime));
    }

    // On va chercher les informations sur l'image
    $imgInfo = getimagesize($uri) or diewith("Impossible d'ouvrir l'image");
    $srcWidth =  $imgInfo[0]; // largeur
    $srcHeight = $imgInfo[1]; // hauteur
    $srcType   = $imgInfo[2]; // type de fichier
    switch($srcType) { 
        case 1 : $srcType = "gif"; break;
        case 2 : $srcType = "jpeg"; break;
        case 3 : $srcType = "png"; break;
        default: $srcType = "???";
    } 
    
    // On applique la grandeur si la méthode stretch est choisie
    if ($method == "stretch") {

        $outWidth  = $inWidth;
        $outHeight = $inHeight;
    
    } else { // On applique la méthode fit
       
        $xRatio = ($inWidth) ?  ($srcWidth  / $inWidth) : 0;
        $yRatio = ($inHeight) ? ($srcHeight / $inHeight): 0;
        $ratio = max($xRatio, $yRatio, 1);
        $outWidth = intval($srcWidth / $ratio);
        $outHeight = intval($srcHeight/ $ratio);
        
    }
    
    // On fabrique le nom de l'image en cache
    $cacheName = md5($uri).'-'.basename($uri).'#'.$outWidth.'x'.$outHeight;
    $cacheFile = dirname(__FILE__) . '/'. $fichier . '/' . $cacheName;
  
    // Si le cache est trop vieux ou exist pas on le créé
    if (!file_exists($cacheFile) or ($srcTime > filectime($cacheFile))) {
        
    if ($imgInfo[0]<$outWidth){$outWidth=$imgInfo[0];}
    if ($imgInfo[1]<$outHeight){$outHeight=$imgInfo[1];}
        
        // On créé l'image de sortie
        $outImg = imagecreatetruecolor ($outWidth, $outHeight);
        
        // On load la source de l'image
        switch($srcType) {
            case "png":
                $srcImg = imagecreatefrompng($uri);
                $blending = false;
                break;
            case "gif":
                $srcImg = imagecreatefromgif($uri);
                $blending = true;
                break;
            case "jpeg":
                $srcImg = imagecreatefromjpeg($uri);
                break;
            default: 
                diewith("Le fichier utilise une extension non supportée '$uri'");
        };
               
        // On applique la nouvelle grandeur a l'image
        imagecopyresampled($outImg, $srcImg, 0, 0, 0, 0, $outWidth, $outHeight, $srcWidth, $srcHeight);
      
        // On sauvegarde l'image dans le cache
        switch($srcType) {
            case "png":
                $res = imagepng($outImg, $cacheFile);
                break;
            case "gif":
                $res = imagegif($outImg, $cacheFile);
                break;
            case "jpeg":
                $res = imagejpeg($outImg, $cacheFile);
                break;
            default: 
                diewith("Type de fichier non supporté '$uri'");
        }

        // On vérifie que sa bien marcher
        if (!$res) diewith("Impossible de sauvegarder '$cacheFile'. Vérifier les droits HTTP du serveur.");
    }

    // HTTP Header
    header("Content-Type:image/$srcType");
   
    // On affiche l'image
    readfile($cacheFile) or diewith("Impossible d'ouvrir '$cacheFile'"); 
?>

Avec ce bout de code, on peut resizer n'importe qu'elle image en changeant

Code :
<img src="image.jpg">

En

Code :
<img src="image.php?method=fit&w=100&h=100&uri=image.jpg">

ce qui donnerait une image 100x100

J'ai fabriquer 2 méthode fit et strech

Ma cliente avait le souci que les images soit bien indexer par google. Et puisque les images ce terminait par ".php" plutôt que ".jpg" j’ai du ajouter un code de redirection par htaccess afin que l'image garde son extension

Fichier .htaccess
Code :
<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteRule  ^(.*)~(.*)x(.*)$  ./thumbs.php?uri=$1&w=$2&h=$3&method=fit
    RewriteRule  ^(.*)~(.*)$  ./thumbs.php?uri=$1&w=$2&h=$2&method=fit
    RewriteRule  ^(.*)=(.*)x(.*)$  ./thumbs.php?uri=$1&w=$2&h=$3&method=stretch
</IfModule>

Ce qui fait que le code pour appeler un image devient

Code :
<img src="image.jpg~100x100">

Pour fabriquer le ~ il suffit de faire "Alt 126"


Veillez cité la source et l'auteur si vous désirer reprendre mon tuto.

Soyez intelligent et restez WhiteHat!
Par CyberSee
+1 (0) -1 (0) Répondre


Atteindre :


Utilisateur(s) parcourant ce sujet : 1 visiteur(s)
N-PN
Accueil | Challenges | Tutoriels | Téléchargements | Forum | Retourner en haut