Bienvenue visiteur (Inscription |  Connexion)
Qui est en ligne ?
Il y a : 20 utilisateurs en ligne, consultez le détail
Auteur Message
ovni
#0 Message posté le : 21-11-2006 à 23:20:33


Scarabée


Forum : Inscrit
Association :
Arrivé(e) le : 16-01-2003
Nombre de messages : 242
Hello!
J'aimerai créer une galerie photo pour un site. J'aimerai que le script puisse :
1. Récuperer les photos sur le disque dur de l'utilisateur et les uploader sur le ftp du site.
2. Inserer chaque nom d'image dans une base SQL
3. Créer une miniature de chaque image

L'étape 1 ne doit pas poser de problème, la 2 non plus mais pour la 3 je ne sais pas si c'est possible. Si oui j'ai aucune idée de comment faire... Si quelqu'un a une idée...?

-------------------------------------
ganlhi
#1 Message posté le : 21-11-2006 à 23:27:04


Hobbit


Forum : Inscrit
Association :
Arrivé(e) le : 07-07-2003
Nombre de messages : 1722
Je ne saurais pas le faire, là tout de suite, mais je sais qu'il existe des bibliothèques PHP pour générer des miniatures... Un dev web dans la salle ?

-------------------------------------
GANLHI

http://ganlhi.jexiste.fr
Linux User n°366208

"Pour gagner ce jeu, il faut une jolie boîte, une jolie copine, et le reste on s'en fout"
nonoland
#2 Message posté le : 22-11-2006 à 08:20:41


Hobbit


Forum : Inscrit
Association :
Arrivé(e) le : 17-01-2004
Nombre de messages : 1727
sinon il y a un petit soft qui fait a peu pres ce que tu demandes : www.jalbum.net


-------------------------------------
Linux user #377793
Petition Free IPv6 # 18366
jblecanard
#3 Message posté le : 22-11-2006 à 09:54:28


Jedi


Forum : Modérateur
Association : Membre fondateur
Arrivé(e) le : 08-01-2005
Nombre de messages : 4030
Salut

oui oui moi je suis un webdev.

L'étape la plus difficile est en réalité la première. Faire des miniatures est plutôt aisé.

J'ai déjà codé un tel truc. Je te passerai pas les sources car je suis en train de les refaire complètement ( après je les ouvrirai ). Là je suis un peu pressé dès que je repasse je détaillerai un peu mieux la marche à suivre.

-------------------------------------
C'est une situation bien inconfortable que d'être assez sensible à la bêtise pour en souffrir et trop intelligent pour s'en indigner. - Gustave Thibon -
tamiel
#4 Message posté le : 22-11-2006 à 10:11:21


Hobbit


Forum : Inscrit
Association :
Arrivé(e) le : 17-10-2003
Nombre de messages : 1067
Pour les miniatures, il suffit de faire un tag img avec une taille et une hauteur plus petite . (dans un css par exemple en faisant un attribut miniature) .


<img src="/path/to/image" alt="MonImage" class="miniature"/>





et dans le css :



img.miniature

{

 width = 40px;

 height = 40px;

}





-------------------------------------
If you don't know, ask manpage !
jblecanard
#5 Message posté le : 22-11-2006 à 10:17:40


Jedi


Forum : Modérateur
Association : Membre fondateur
Arrivé(e) le : 08-01-2005
Nombre de messages : 4030
Salut Tamiel

cette méthode n'est pas bonne pour faire des miniatures. En effet, le navigateur va charger l'image au complet, puis al redimensionner pour l'afficher. Du coup, la miniature sera aussi lourde à charger qu'un gros fond d'écran par exemple. Avec PHP, on peut générer automatiquement des fichiers de miniatures qui sont alors des fichiers image beaucoup plus petits.

-------------------------------------
C'est une situation bien inconfortable que d'être assez sensible à la bêtise pour en souffrir et trop intelligent pour s'en indigner. - Gustave Thibon -
jblecanard
#6 Message posté le : 22-11-2006 à 11:01:39


Jedi


Forum : Modérateur
Association : Membre fondateur
Arrivé(e) le : 08-01-2005
Nombre de messages : 4030
Alors allons y pour la miniature.

Le principe le plus efficace est le suivant : tu te fais une fonction qui prend en argument le chemin de l'image et renvoie le chemin de la miniature.
De cette manière, la miniature peut être créée automatiquement si elle n'existe pas et ne sera pas recréée si elle existe déjà ( économise le coût en calcul du serveur ). Pour les regénérer, il suffira de vider le répertoire temporaire.

Voici une fonction dont je me servais, écrite en PHP4. Elle est basique car il n'y a pas de gestion des erreurs au cas ou les arguments ne sont pas viables ( fichier source inexistant par exemple ). Elle ne crée toutefois pas de miniature si l'image de départ est plus petite que les dimensions maximales précisées. De plus, les proportions sont conservées.


/* Cette fonction produit une miniature */

/* On peut chosiir le répertoire de stockage de la miniature */

function reduire_image($source,$largeurmax,$hauteurmax,$tmpdir="webdata/tmp/")

	{



	/* Recherche du nom de fichier */

	$fichier=file($source);



	/* Construction du chemin de la miniature */

	$destination=$tmpdir.substr($fichier,0,strlen($fichier)-4)."-mini.png";





	/* Si la miniature existe, on ne la recrée pas */

	if(!(file_exists($destination)))

		{

		/* On obtient des infos sur l'image source */

		$caracteristiques = getimagesize($source);

	

		/* On vérifie que le fichier est trop grand */

		if(($caracteristiques[1]>$hauteurmax)or($caracteristiques[0]>$largeurmax))

			{

			if($caracteristiques[2] == "1")

				$depart = imagecreatefromgif($source);



			if($caracteristiques[2] == "2")

				$depart = imagecreatefromjpeg($source);



			if($caracteristiques[2] == "3")

				$depart = imagecreatefrompng($source);

	

			/* On calcule la largeur et hauteur d'arrivée */

			/* En conservant les proportions */

		

			$h_i = $caracteristiques[1];

			$w_i = $caracteristiques[0];

	

			if($h_i >$hauteurmax)

				{

				$convert=$hauteurmax/$h_i;

				$h_i=$hauteurmax;

				$w_i=ceil($w_i*$convert);

				}

	

			if($w_i >$largeurmax)

				{

				$convert=$largeurmax/$w_i;

				$w_i=$largeurmax;

				$h_i=ceil($h_i*$convert);

				}

	

		 	/* On créée une image miniature vide */

			$arrivee = imagecreatetruecolor($w_i,$h_i);



			/* On la rempli avec l'autre redimensionnée */

			imagecopyresampled($arrivee,$depart, 0, 0, 0, 0, $w_i,$h_i,$caracteristiques[0], $caracteristiques[1]);



			/* On enregistre la miniature */

			imagepng($arrivee,$destination);

			}

		/* Si le fichier est trop petit, on renvoie le chemin original */

		else

			$destination=$source;

		

		}



	return($destination);

	}



Tu peux t'en inspirer, ou même t'en servir en rajoutant la gestion des erreurs.

Pour l'upload, il y plusieurs manières :
- Faire envoyer les fichiers un par un par l'utilisateur.
- Lui faire envoyer une archive que PHP désarchive ensuite.

Enfin, pour l'enregistrement du chemin de l'image dans la abse MySQL, prend bien garde de placer un test d'existence du fichier avant l'enregistrement dans MySQL. ça t'évitera des liens morts.

N'hésite pas à poser des questions

@+

Edit : pour bien faire, faudrait recoder tout ça à la PHP5, ce que je ferais un jour.

--Message édité par jblecanard le 28-12-2006 à 12:28:43--


-------------------------------------
C'est une situation bien inconfortable que d'être assez sensible à la bêtise pour en souffrir et trop intelligent pour s'en indigner. - Gustave Thibon -
ovni
#7 Message posté le : 22-11-2006 à 13:24:48


Scarabée


Forum : Inscrit
Association :
Arrivé(e) le : 16-01-2003
Nombre de messages : 242
whaou merci beaucoup!:) c'est exactement ce que je cherchais!
Je vais essayer de mettre en place tout ca ces prochains jours.
Et sinon impossible d'uploader directement un dossier avec les images qu'il contient...? sinon l'option de l'archive est bien aussi.
Encore merci!


-------------------------------------
jblecanard
#8 Message posté le : 22-11-2006 à 14:45:48


Jedi


Forum : Modérateur
Association : Membre fondateur
Arrivé(e) le : 08-01-2005
Nombre de messages : 4030
Salut

Non uploader directement un dossier n'est possible qu'avec une applet java, et je sais pas comment faire. C'est archive ou fichier par fichier. Tu pourrais faire qque chose qui détecte si c'est une arhcive ou une image avec l'extension, ce sera pratique d'utilisation.

-------------------------------------
C'est une situation bien inconfortable que d'être assez sensible à la bêtise pour en souffrir et trop intelligent pour s'en indigner. - Gustave Thibon -
ovni
#9 Message posté le : 22-11-2006 à 23:54:54


Scarabée


Forum : Inscrit
Association :
Arrivé(e) le : 16-01-2003
Nombre de messages : 242
Voila alors je viens de terminer le script.
si ca interresse qqn:
1. on créé un dossier dans lequel on va uploader les photos
2. on upload les photos (j'ai réussi a uploader plusieurs photo d'une traite avec une boucle)
3. on créé un dossier dans lequel les miniatures vont etre placé, on créé les miniature.


<!-- Nom du repertoire qui va contenir les photos -->

<form method="POST" name="rep" action="insertimg.php?etape=2">

		Nom du répertoire* :

		<input type="text" name="repertoire" /><br /><input type="submit" value="ok" />

		</form>



<?php 

}



if ($etape == 2) //creation du repertoire

{

if (empty($dir))

	$dir = $_POST['repertoire'];





	if(is_dir("images/galeries/$dir")) //verifie si le rep existe deja

		{

			echo '<center>Erreur, ce répertoire existe déjà! Ne continuez que si vous voulez ajouter des photos à cet événement!</center>';

		}

	else //s'il n'existe pas

		{

			mkdir('images/galeries/'.$dir, 0777); //Creer le rep avec droits

			if(is_dir("images/galeries/$dir"))

			echo '<center>Répertoire créer avec succès</center>';

			else 

			echo '<center>Problème lors de la création du répertoire!</center>';

		}

?>

<!-- Recherche des images sur le disque de l'utilisateur -->

		<form method="POST" enctype="multipart/form-data" action="insertimg.php?etape=3&dir=<?echo $dir;?>">

		Photos :<br />

		<input type="file" name="1" /><br />

		<input type="file" name="2" /><br />

		<input type="file" name="3" /><br />

		<input type="file" name="4" /><br />

		<input type="file" name="5" /><br />

		<input type="file" name="6" /><br />

		<input type="file" name="7" /><br />

		<input type="file" name="8" /><br />

		<input type="file" name="9" /><br />

		<input type="file" name="10" /><br />

		<br /><input type="submit" name="upload" value="ok" />

		</form>	

<?php

}



if ($etape == 3)

{

if( isset($_POST['upload']) ) // si formulaire soumis

{

$i = 1;



while ($a = $i)

{

    $content_dir = 'images/galeries/'.$dir.'/'; // dossier creer precedemment où sera déplacé le fichier

    $tmp_file = $_FILES[$i]['tmp_name'];



    if( !is_uploaded_file($tmp_file) )

    {

        exit("<center>Fin du transfert.<br />

<a href=\"insertimg.php?etape=2&dir=$dir\">Continuer à transférer des photos pour $dir.</a><br />

<a href=\"insertimg.php?etape=4&dir1=$dir\">Prochaine étape.</a></center>");

    }



    // on vérifie maintenant l'extension

    $type_file = $_FILES[$i]['type'];



    if( !strstr($type_file, 'jpg') && !strstr($type_file, 'jpeg') && !strstr($type_file, 'bmp') && !strstr($type_file, 'gif') && !strstr($type_file, 'png') )

    {

        exit("Le fichier n'est pas une image");

    }



    // on copie le fichier dans le dossier de destination

    $name_file = $_FILES[$i]['name'];



    if( !move_uploaded_file($tmp_file, $content_dir . $name_file) )

    {

        exit("Impossible de copier le fichier dans $content_dir");

    }



    echo '<center>L\'image '.$_FILES[$i]['name'].' a bien été transférée! <br /></center>';

$i++;

}



}

}

if ($etape == 4)

{

if (!is_dir('images/galeries/'.$dir1.'/mini'))

{

mkdir('images/galeries/'.$dir1.'/mini', 0777);

}

if (is_dir('images/galeries/'.$dir1.'/mini'))

	echo '<center>(Répertoire miniature crée.)</center>';

function reduire_image($source,$largeurmax,$hauteurmax,$tmpdir)

{

	$a=strlen($source)-1;

	while(substr($source,$a,1)<>"/")

		$a=$a-1;

	$fichier=substr($source,$a+1);

	

	$destination=$tmpdir.substr($fichier,0,strlen($fichier)-4)."-mini.png";

	

	if(!(file_exists($destination)))

		{

		

		$caracteristiques = getimagesize($source);

		

		if(($caracteristiques[1]>$hauteurmax)or($caracteristiques[0]>$largeurmax))

			{

			if($caracteristiques[2] == "1")

				$depart = imagecreatefromgif($source);

			if($caracteristiques[2] == "2")

				$depart = imagecreatefromjpeg($source);

			if($caracteristiques[2] == "3")

				$depart = imagecreatefrompng($source);

		

			$h_i = $caracteristiques[1];

			$w_i = $caracteristiques[0];

			if($h_i >$hauteurmax)

				{

				$convert=$hauteurmax/$h_i;

				$h_i=$hauteurmax;

				$w_i=ceil($w_i*$convert);

				}

			if($w_i >$largeurmax)

				{

				$convert=$largeurmax/$w_i;

				$w_i=$largeurmax;

				$h_i=ceil($h_i*$convert);

				}

		 

			$arrivee = imagecreatetruecolor($w_i,$h_i);



			

			imagecopyresampled($arrivee,$depart, 0, 0, 0, 0, $w_i,$h_i,$caracteristiques[0], $caracteristiques[1]);

		

			imagepng($arrivee,$destination);

			}

		

		else

			$destination=$source;

		}

	return($destination);

}

$curdir = "images/galeries/$dir1/";

      $dir = opendir($curdir);

      // on scanne le répertoire

      while($p=readdir($dir)) {

         // si c'est un fichier

         if(is_file($curdir."/".$p)) {

            // si c'est une extension d'image

            $ext = strtolower(substr($p, strrpos($p, '.') + 1));

            if(   ($ext=="jpg") || ($ext=="jpeg")

               || ($ext=="gif")

               || ($ext=="bmp")

               || ($ext=="png")) {

               // lien vers l'image

               echo $p.'<br>';

		reduire_image('images/galeries/'.$dir1.'/'.$p,'200','200','images/galeries/'.$dir1.'/mini/');

            }

         }

      }



}


Voila en tout cas le script marche, le code peut surement etre plus simple mais je n'ai pas trop fait attention a ca pour l'instant.

--Message édité par ovni le 22-11-2006 à 23:58:51--


-------------------------------------
olilem
#10 Message posté le : 09-12-2006 à 10:43:25


Petit scarabée


Forum : Inscrit
Association :
Arrivé(e) le : 09-12-2006
Nombre de messages : 3
ovni a écrit :


Hello!
J'aimerai créer une galerie photo pour un site. J'aimerai que le script puisse :
1. Récuperer les photos sur le disque dur de l'utilisateur et les uploader sur le ftp du site.
2. Inserer chaque nom d'image dans une base SQL
3. Créer une miniature de chaque image

L'étape 1 ne doit pas poser de problème, la 2 non plus mais pour la 3 je ne sais pas si c'est possible. Si oui j'ai aucune idée de comment faire... Si quelqu'un a une idée...?


Bonjour tu as essayé avec PhpWebGallery : http://www.phpwebgallery.net/fre/index.html
ts404
#11 Message posté le : 11-12-2006 à 03:19:49


Petit scarabée


Forum : Inscrit
Association :
Arrivé(e) le : 11-12-2006
Nombre de messages : 1
Bon, j'ai repris ce petit code (merci beaucoup a tous pour votre post enrichissant) et je vous file ma version adaptée a mes besoins et perfectionnée (un peu).

Le bug de l'ancienne version était que si tu mettait une photo dans le form file 2 et pas dans le 1er, ca n'uploadait quand meme pas la seconde. C'est pourquoi j'ai remplacé la boucle while par la for($i=1, $i!= 6, $i++) et rajouté des variables pour controler le nombre de formulaires affichés.

Bref, le code est hyper bordélique mais je m'efforce de jour en jour a aérer, a laisser respirer les caractères...

<?php

			session_start();

			

// Nombre de photos souhaitée

$nmbre_photo = 15;





?>

<!-- Recherche des images sur le disque de l'utilisateur -->



		<form method="POST" enctype="multipart/form-data" action="">

		Photos :<br />

<?

for ($nmbre_form = 1; $nmbre_form != $nmbre_photo + 1; $nmbre_form++) {

//debut boucle de création de formulaire

?>

		<input type="file" name="<? echo $nmbre_form; ?>" /><br />

<?

}

// fin  boucle de création de formulaire

?>





		<br /><input type="submit" name="upload" value="Télécharger ces photos" />



		</form>	



<?

if( isset($_POST['upload']) ) // si formulaire soumis (le formulaire est en dessous

{



	for ($i=1; $i != $nmbre_photo + 1; $i++)

	

	{	

			$content_dir = "test/"; // dossier où sera déplacé le fichier

	

			$fichier_temporaire_sur_serveur = $_FILES[$i]['tmp_name'];

			

			

		if( is_uploaded_file($fichier_temporaire_sur_serveur) )

	

		{



			// on vérifie maintenant l'extension

		

			$format_fichier = $_FILES[$i]['type'];

		

		

		

			if( !strstr($format_fichier, 'jpg') && !strstr($format_fichier, 'jpeg') && !strstr($format_fichier, 'bmp') && !strstr($format_fichier, 'gif') && !strstr($format_fichier, 'png') )

		

			{

		

				exit("<br />Le fichier ".$_FILES[$i]['name']." n'est pas un format de photo supporté par annonces de la mer. Veuillez convertir votre photo au format .jpg, .png ou .gif");

		

			}

				

			// on assigne une extension

			if ($format_fichier == "image/jpeg") { $extention = ".jpeg"; }

			if ($format_fichier == "image/jpg") { $extention = ".jpg"; }

			if ($format_fichier == "image/png") { $extention = ".png"; }

			if ($format_fichier == "image/bmp") { $extention = ".bmp"; }

			if ($format_fichier == "image/gif") { $extention = ".gif"; }

			

			//On prépare le nom de fichier avec le timestamp actuel

			

			$timestamp = time();

			$nom_fichier = $timestamp."-".$i.$extention; // Je rajoute le -$i parce que sinon ca réécrit sur l'image uploadé précédemment dans la boucle : le timestamp reste le même puisque le script est exécuté en un millième de seconde.

			

		

			//On bouge le fichier temporaire dans le dossier correspondant

			if( !move_uploaded_file($fichier_temporaire_sur_serveur, $content_dir . $nom_fichier) )

		

			{

		

				exit("Impossible de copier le fichier dans $content_dir");

		

			} -+

			// On refout le dossier en chmod 0755 (pour les serveurs pas sympa comme le mien)

			chmod ($content_dir.$nom_fichier, 0755);

			//Là, je stocke le nom de la photo (celle qui est enregistrée sur le serveur avec le timestamp)

			//sur une variable en session pour pouvoir l'utiliser a ma guise dans les pages d'après (attention a la sécurité quand même), un pingouin reste un pingouin, mais le loup rôde.



			

			$_SESSION["photo".$i] = "$nom_fichier";

			

			

			echo '<center>L\'image '.$_FILES[$i]['name'].' a bien été transférée! <br /></center>';

			echo $_SESSION["photo".$i];

			

		

	

		} // fin if is uploaded file

	

	

	

	

	} //fin boucle for

	

	if( !is_uploaded_file($fichier_temporaire_sur_serveur) )

	{

		exit("<center>Fin du transfert.<br />

		<a href=\"insertimg.php?etape=2\">Continuer à transférer des photos pour $dir.</a><br />

		<a href=\"insertimg.php?etape=4\">Prochaine étape.</a></center>");

	}

}





?>







Joyeux noel bientot