Je développe depuis maintenant quelques temps en php et je souhaiterais vous faire partager quelques un de mes scripts.
Bien sur ce ne sont que de modestes codes sans prétentions qui sont ,et j'en suis sur, améliorables, mais étant on va dire débutant "confirmé" , soyez indulgent envers moi.
Dans le cas présent il s'agit d'un script permettant d'uploader des images (un repertoire complet).
La problématique étais la suivante: pouvoir récuperer des photos situées dans un repertoire uniquement accesible par FTP et les publier sur un site via une interface d'administration.
Ces images faisant partie d'une animation flash, elles sont gérees en plus via des fichiers XML qui doit etre actualisés à chaque upload (ça c'etait pas le plus dur à faire.. )
J'ai beau eu chercher sur le net des scripts permettant de le faire, je n'ai pas trouvé, aussi j'ai donc décidé de le faire et de vous le faire partager.
Code : | Sélectionner tout |
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 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 | <?PHP require_once('fonction_rep.php');//appel du fichier de fonction globales require_once('xml/fonction_xml.php');//appel du fichier de fonction xml require_once('explorateur_fct.php');//appel du fichier de fonction ini_set ('max_execution_time', 0); // Aucune limite d'execution //recuperations des variables issue de la requete ajax $destination=$_GET['destination']; //repertoire ou seront uploadées les images //titre et description de la serie d'image facultatif $titre=$_GET['titre']; $description=$_GET['description']; $cdf=$_GET['cdf'];//variable pour savoir si les images sont en ligne ou non true ou false $source=$_GET['source']; $tab_source=explode('/',$source); $rang=count($tab_source)-1; $rep_source=$tab_source[$rang]; //je recupere juste le nom du dossier pour prefixer la photo $tabentete=explode('/',$destination); $n=count($tabentete)-1; $entete=$tabentete[$n]; //je compte le nombre d'image du rep de destination car les images devront avoir un N° d'ordre en plus du nom (cahier des charges..) $nbimage=compte_image($destination); $cpt=$nbimage+1; $ext_image = array(".jpg", ".jpeg", ".png", ".bmp", ".gif", ".ico", ".tiff"); //connexion FTP $connexion=connect_to(); //je parcours le rep source $contents = ftp_nlist($connexion,'/'); for($i=0;$i<count($contents);$i++) { $ret=ftp_nlist($connexion,'.'.$contents[$i]); if( $contents[$i] == '/'.$rep_source) { for($z=0;$z<count($ret);$z++) { // je suis dans le bon rep, je recupere que les images $ext = strrchr($ret[$z],'.'); $ext = strtolower($ext); if (in_array($ext,$ext_image)) { //je renomme en mettant un N° $nom_tmp=str_replace($rep_source.'/','',$ret[$z]);//je vire le debut( img.jpg) $nom_tmp=str_replace($ext,'',$nom_tmp);//je vire l'extension(img) $newimage=str_replace($nom_tmp,$cpt,$ret[$z]); $link=imagefromFTP($ret[$z]); switch($ext) { case".jpg": $type_img=imagecreatefromjpeg($link); break; case".jpeg": $type_img=imagecreatefromjpeg($link); break; case".png": $type_img=imagecreatefrompng($link); break; case".gif": $type_img=imagecreatefromgif($link); break; default: $type_img=imagecreatefromjpeg($link); break; } list($width, $height) = getimagesize($link); //je redimensionne l'image en 700 par 700 maxi $tab_dim=redimage($link,'700','700'); $NouvelleImage = imagecreatetruecolor($tab_dim['new_width'] , $tab_dim['new_height']) or die ("Erreur1"); imagecopyresampled($NouvelleImage , $type_img,0,0, 0,0, $tab_dim['new_width'] , $tab_dim['new_height'], $width,$height); $img_final=$destination.'/'.$entete.'_'.$cpt.$ext; //echo 'newimage'.$newimage.chr(10).'imlgfinal '.$img_final.chr(10); imagejpeg($NouvelleImage, $img_final); $cpt++; } } } } //je reecris le xml xml_lot($destination,$cdf,utf8_encode($titre),utf8_encode($description),'lot'); ?> |
Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | function connect_to() { // création de la connexion $conn_id = ftp_connect("adresse_FTP"); $login='login'; $mdp='mdp'; $login_result = ftp_login($conn_id, $login, $mdp); ftp_pasv($conn_id, TRUE); return $conn_id; } |
Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 | function imagefromFTP($fic) { $url = "@adresse_FTP/"; $login='login:'; $mdp='mdp'; // cree l'image issue du ftp $link='ftp://'.$login.$mdp.$url.$fic; return $link; } |
Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | function compte_image($dir) { $num = 0; $limitedext = array(".jpg", ".jpeg", ".png", ".bmp", ".gif","swf"); $nom_ignore = array( 'ico_b.png', 'ico_th.png', 'icone.png'); $dir_handle = opendir(trim($dir)); while($entry = readdir($dir_handle)) { $ext = strrchr($entry,'.'); $ext = strtolower($ext); if(is_file($dir.'/'.$entry) && in_array($ext,$limitedext ) && !in_array($entry,$nom_ignore )) { $num++; } } closedir($dir_handle); return $num; } |
Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | function redimage($img_src,$dst_w,$dst_h) { // Lit les dimensions de l'image $size = getimagesize($img_src); $src_w = $size[0]; $src_h = $size[1]; // Teste les dimensions tenant dans la zone $test_h = round(($dst_w / $src_w) * $src_h); $test_w = round(($dst_h / $src_h) * $src_w); // Si Height final non précisé (0) if(!$dst_h) $dst_h = $test_h; // Sinon si Width final non précisé (0) elseif(!$dst_w) $dst_w = $test_w; // Sinon teste quel redimensionnement tient dans la zone elseif($test_h>$dst_h) $dst_w = $test_w; else $dst_h = $test_h; // Affiche les dimensions optimales //echo "WIDTH=".$dst_w." HEIGHT=".$dst_h; return array('new_width'=>$dst_w, 'new_height'=>$dst_h); } |
Code : | Sélectionner tout |
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 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 | function xml_lot($rep,$chemindefer,$titre,$description,$qt) { //creation d'un xml apre un upload par lot // creation des array des noeuds et des items de l'xml $tab_noeud=array('repertoires', 'images'); $tab_item=array('repertoire','image'); $tab_sous_rep=array('nom', 'titre'); $tab_sous_fich=array('fichier', 'description'); $xml_string='<?xml version="1.0" encoding="UTF-8"?>'.chr(10); if($chemindefer==true) { $xml_string.='<'.$tab_noeud[1].'>'.chr(10); $xml_img=''; $xml_rep=''; } else { $xml_string.='<'.$tab_noeud[0].'>'.chr(10); $xml_img=''; $xml_rep=''; } //listage du repertoire $contenu_dir=lister($rep); $tabdossier=$contenu_dir['repertoire']; $tabimage=$contenu_dir['image']; /********************************/ /* images */ /********************************/ $tab_img_tmp=array(); if(count($tabimage)>0) { $nbimage=count($tabimage); //echo 'nbr d\'image'.$nbimage; foreach($tabimage as $value) { //echo $value.'<br/>'; //je vire le .jpg $value=str_replace('.jpg','',$value); //je vire le _th $value=str_replace('_th','',$value); //je vire le _b $value=str_replace('_b','',$value); //je vire les extensions array_push($tab_img_tmp,$value); } //je vire les doublons $tab_img_tmp=array_unique($tab_img_tmp); //je reindexe le tableau $tab_img_tmp=array_values($tab_img_tmp); //chaine xml image for($i=0;$i<count($tab_img_tmp);$i++) { if($tab_img_tmp[$i] !='ico') { $xml_img.='<'.$tab_item[1].'>'.chr(10);//<image> $etat=1; $xml_img.='<'.$tab_sous_fich[0].'>'.$tab_img_tmp[$i].'</'.$tab_sous_fich[0].'>'.chr(10);//fichier $xml_img.='<'.$tab_sous_fich[1].'>'.$i.' '.$description.'</'.$tab_sous_fich[1].'>'.chr(10);//description } else { $etat=0; $xml_img.=''; } if($etat==1) { $xml_img.='</'.$tab_item[1].'>'.chr(10);//<image> } else { $xml_img.='</'.$tab_item[0].'>'.chr(10);//<image> } }//for if($chemindefer=='oui') { $xml_img.='</'.$tab_noeud[1].'>'.chr(10); } else { $xml_img.='</'.$tab_noeud[0].'>'.chr(10); } $xml_string.=$xml_img; } //j'ecrits le xml $xml_ref=$rep.'/galerie.xml'; $Fw= fopen($xml_ref,"w"); fseek ($Fw, 0); //positionne au debut fputs ($Fw, $xml_string); //ecrit la chaine fclose ($Fw); //ferme } |
Tout ceci (et il n'yen a qu'une petite partie) faisait parti de mon premier gros projet, et je suppose qu'il peut etre amélioré.
Au final ce script permet d'uploader un repertoire entier d'image (ou en partie en rajoutant une checbox a chaque image et en prenant en compte que les chkbox cochées)