Précédent   Forum des professionnels en informatique > PHP > Langage > Contribuez
Contribuez Proposez vos articles, cours, tutoriels, FAQ, sources, etc. pour PHP
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Actualité déjà publiée
 
Outils de la discussion
Publicité
Vieux 25/10/2009, 22h26   #1
Invité de passage
 
Michel Lambert
Développeur informatique
Inscription : octobre 2009
Messages : 7
Détails du profil
Informations personnelles :
Nom : Michel Lambert

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : octobre 2009
Messages : 7
Points : 1
Points : 1
Par défaut Upload d'image par lot et FTP

Bonsoir, bon je me lance dans le grand bain..
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 :
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');
 
?>
la fonction connect_to permettant d'ouvrir une connexion ftp

Code :
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;  
 
}
la fonction permettat de recuperer le lien de l'image avec en parametre le repertoire et le nom de l'image en cours
Code :
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;
}
la fonction permettant de compter le nombre d'image contenue dans le repertoire sans tenir compte des icones, la aussi cela faisait parti du cahier des charges

Code :
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;
     }
la fonction de redimensionnement des images
Code :
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);
}
et la fonction d'ecriture du fichier xml necassaire à la visualisatiion des images dans l'animation flash
Code :
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 
 
 
}
voila j'espere que cela pourra etre utile à quelqu'un.
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)
lewis34 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/11/2009, 12h07   #2
Membre du Club
 
Inscription : décembre 2002
Messages : 53
Détails du profil
Informations forums :
Inscription : décembre 2002
Messages : 53
Points : 46
Points : 46
Envoyer un message via MSN à Sowa Envoyer un message via Yahoo à Sowa
Salut,
J'ai pas réellement testé ton script mais je trouve que ce serait une bonne chose si tu pouvais améliorer un tout petit peu la mise en forme....
Sowa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/11/2009, 21h38   #3
Invité de passage
 
Michel Lambert
Développeur informatique
Inscription : octobre 2009
Messages : 7
Détails du profil
Informations personnelles :
Nom : Michel Lambert

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : octobre 2009
Messages : 7
Points : 1
Points : 1
je vais y veiller à l'avenir , il est vrai que j'ai pris de mauvaises habitude mais le principal c'est que ce script fonctionne à 100%

j'en ai d'autres sous le chapeau que je partagerais sous peu.

Par contre aurais tu un conseil de mise en forme, autant faire les choses bien, je ne demande qu'a continuer d'apprendre, c'est en faisant des ereurs que l'on, apprend
lewis34 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/11/2009, 22h14   #4
Modérateur
 
Avatar de mathieu
 
Inscription : juin 2003
Messages : 4 894
Détails du profil
Informations forums :
Inscription : juin 2003
Messages : 4 894
Points : 4 465
Points : 4 465
Citation:
Envoyé par lewis34 Voir le message
Par contre aurais tu un conseil de mise en forme, autant faire les choses bien, je ne demande qu'a continuer d'apprendre, c'est en faisant des ereurs que l'on, apprend
tu pourrais par exemple indenter le code en mettant au même niveau les lignes qui sont dans le même bloc comme par exemple
Code :
1
2
3
4
        $Fw= fopen($xml_ref,"w");
                     fseek ($Fw, 0); //positionne au debut
                     fputs ($Fw, $xml_string); //ecrit la chaine
                     fclose ($Fw); //ferme
qui peut se mettre comme ça :
Code :
1
2
3
4
        $Fw= fopen($xml_ref,"w");
        fseek ($Fw, 0); //positionne au debut
        fputs ($Fw, $xml_string); //ecrit la chaine
        fclose ($Fw); //ferme
et pareil pour les boucles qui pourraient donner ça par exemple
Code :
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
                //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;
après c'est à toi de décider ta façon d'indenter et de regarder à chaque fois à la fin en te disant "si je relis ce code dans 6 mois est ce qu'il sera toujours aussi clair que maintenant ?"
__________________
Modérateur PHP
mathieu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/11/2009, 03h49   #5
Invité de passage
 
Michel Lambert
Développeur informatique
Inscription : octobre 2009
Messages : 7
Détails du profil
Informations personnelles :
Nom : Michel Lambert

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : octobre 2009
Messages : 7
Points : 1
Points : 1
ok, merci mathieu .
lewis34 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/11/2009, 19h25   #6
Invité régulier
 
Abeille Abeille
Inscription : novembre 2009
Messages : 13
Détails du profil
Informations personnelles :
Nom : Abeille Abeille

Informations forums :
Inscription : novembre 2009
Messages : 13
Points : 5
Points : 5
Par défaut Upload images

Bonjour,

J'ai un problème analogue. Je dois mettre sur le site web plusieurs répertoires
d'images qui ont été crées sur le disque dur.
Je vais voir si je peux utiliser ton code.


Isabelle
perles est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/11/2009, 04h52   #7
Invité de passage
 
Michel Lambert
Développeur informatique
Inscription : octobre 2009
Messages : 7
Détails du profil
Informations personnelles :
Nom : Michel Lambert

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : octobre 2009
Messages : 7
Points : 1
Points : 1
Bonjour, aucun problemes, ce petit bout de script est fait pour etre utilisé, tu peut l'adapter à tes besoins.
Si tu a un soucis n'hesite pas
lewis34 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Actualité déjà publiée
Outils de la discussion



Fuseau horaire GMT +1. Il est actuellement 06h48.


 
 
 
 
Partenaires

Hébergement Web