• STATISTIQUES
  • Il y a eu un total de 3 membres et 11991 visiteurs sur le site dans les dernières 24h pour un total de 11 994 personnes!


    Membres: 2 435
    Discussions: 3 586
    Messages: 32 833
    Tutoriels: 78
    Téléchargements: 38
    Sites dans l'annuaire: 58


  • ANNUAIRE
  • [FR] InfoMirmo
    Apprentissage de l'informatique par l'intermédiaire de challenges de sécurité. Venez app...
    Hacking
    [EN] Hack this site
    Basic: 11, Realistic: 17, Application: 18, Programming: 12, Extbasic: 14, Javascript: 7, Stego: 17
    Challenges
    [EN] Rosecode
    Programming: 36, Math: 29, Probability: 5, Sequence: 7, Crypto: 4, Brainf**k: 13, TimeRace: 4, Hack: 9
    Challenges
    [EN] Astalavista
    Un site aux ressources incontournable depuis plusieurs années, Astalavista est réellement devenue un cl...
    Hacking
    [EN] Rankk
    Site de challenge construit sur le principe d'une pyramide à 9 level. Level 1: 60,Level 2: 72,Level 3: 68,Lev...
    Challenges
    [EN] Sabre Films
    Site de challenge présenté sous la forme d'une quête. Vous êtes un détective et devrez résoudre d...
    Challenges
    [FR] Root-Me
    Notre équipe se base sur un constat : à l'heure actuelle ou l'information tend à devenir...
    Hacking

  • 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