Upload photo : quelle méthode pour créer des réductions à la volée ?

Eléphanteau du PHP | 31 Messages

10 déc. 2008, 16:21

Bonjour,
Je me pose une question pour optimiser mon script et éviter de surcharger le serveur.

Je permet l'upload de fichier image sur mon site pour créer des galerie de photos.
Les photos sont modifiées à la volée après l'upload pour :
1) réduire la taille
2) créer des miniatures

QUelle est la meilleure méthode :
a) après l'upload, je créé immédiatement la réduction puis la miniature avec la fonction imagecopyresampled sans utiliser move_uploaded_file . Est ce que je ne vais surcharger le dossier temporaire ? Se vide t-il automatiquement ? faut-il supprimer les photos uploadées celles ci n'ayant jamais été déplacées ?

b) une autre méthode : mettre les photos dans un dossier x par la focntion move_uploaded_file. Puis créer la réduction et la miniature, puis effacer la photo qui a été mise dans le dossier x?

Merci pour vos réponses.

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

10 déc. 2008, 17:57

Que tu laisse la photo uploadée dans le temp ou la déplacer dans un dossier ne change rien pour l'objectif qui est de la redimensionner avant de la loger dans sa destination finale.

Ce qui veut dire que ta méthode (b) ajoute un déplacement de plus qui ne vaut pas la peine. Je pense que la méthode (a) est plus appropriée.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

ViPHP
AB
ViPHP | 5818 Messages

10 déc. 2008, 18:02

Dans mes souvenirs, la méthode a n'est pas facile à faire fonctionner, mais je m'y étais peut-être mal pris à l'époque...

ViPHP
ViPHP | 4674 Messages

10 déc. 2008, 18:07

Hey :),

Sadeq +1.
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Eléphanteau du PHP | 31 Messages

10 déc. 2008, 23:37

Je met le code de mon script (issu de plusieurs scripts que j'ai adapté mais je ne suis pas un pro !).
Il fonctionne en local mais je ne l'ai pas testé on line.

L'objectif :
- télécharger l'image (plusieurs fichiers possibles),
- tester le fichier (taille extension, ...) : (je n'ai pas mis ces lignes)
- avant de déplacer le fichier, tester sa taille et en réduire la taille et/ou le poids selon sa taille et le déplacer ensuite
- créer la miniature


Mes questions sont :
1) que devient le fichier dans le dossier temporaire ? Est-il détruit automatiquement ? et quand ?
2) je suis novice : comment améliorer le script ?

            // Upload si tout est ok
            if( $arrImg[$i]['upload'] )
            {
				$nom_origine = $_FILES['photo']['name'][$i] ;
				// formatage nom fichier d'orgine Enlever les accents
    			$nom_origine = strtr($nom_origine, 'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ', 'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
    			// remplacer les caracteres autres que lettres, chiffres et point par _
    			$nom_origine = preg_replace('/([^.a-z0-9]+)/i', '_', $nom_origine);

				// création d'un nom de fchier théoriquement unique
				$nom = uniqid().".".$ext ;

				// Taille de l'image dans le dossier temporaire
						$size = getimagesize($_FILES['photo']['tmp_name'][$i]);
						$hauteur = $size[1];
						$largeur = $size[0];
						$extension = $size[2];
						$hauteur_orig = $size[1]; // pour base de données
						$largeur_orig = $size[0]; // pour base de données

							if ($largeur > $limite_photo) // on calcule les dimensions de la photos si sa largeur dépasse la limite fixée
							{
							$hauteur = $hauteur / ($largeur / $limite_photo); // Calcule de la hauteur de la photo réduite
							$largeur = $limite_photo;
							}
							
							switch ($extension) {
                			case 1: // GIF
                      				$source = imagecreatefromgif($_FILES['photo']['tmp_name'][$i]); // L'image est la source
                					break;
                			case 2: //JPEG
                    			    $source = imagecreatefromjpeg($_FILES['photo']['tmp_name'][$i]); // L'image est la source
               						break;
              				case 3: // PNG
                        			$source = imagecreatefrompng($_FILES['photo']['tmp_name'][$i]); // L'image est la source
                					break;
									}
						
						$destination = imagecreatetruecolor($largeur, $hauteur); // On crée la miniature vide
						
						// Notez bien que l'on n'est pas obligé de faire ces calculs, car on les a déjà fait. Moi je préfère, pour plus de sureté
						$largeur_source = imagesx($source); // Largeur de la source
						$hauteur_source = imagesy($source); // Hauteur de la source
						$largeur_destination = imagesx($destination); // Largeur de la miniature
						$hauteur_destination = imagesy($destination); // Hauteur de la miniature

						
						// Création de la photo réduite
						imagecopyresampled($destination, $source, 0, 0, 0, 0, $largeur_destination, $hauteur_destination, $largeur_source, $hauteur_source); 

						switch ($extension) {
                			case 1: // GIF
                        		$upload = imagegif($destination, $dest_dossier.$nom);
                				break;
               			 	case 2: //JPEG
                        		$upload = imagejpeg($destination, $dest_dossier.$nom); 
               					break;
                			case 3: // PNG
                      		 	$upload = imagepng ($destination, $dest_dossier.$nom); 
              					break;
								}
						
							//on libere la memoire du serveur
							imagedestroy ($destination); 
					
							
						

              	if( $upload ) // si l'upload a réussi, on peut créer la miniature. on prend note de la réussite (message d'info)
			   	{
                $arrImg[$i]['message'] = 'L\'image ' . $_FILES['photo']['name'][$i] . ' a été transférée avec succès';
 				
				
				//Création de la miniature
						
						if($hauteur >= $limite_mini OR $largeur >= $limite_mini)
						{
							switch ($extension) {
                			case 1: // GIF
                      				$source = imagecreatefromgif($dest_dossier.$nom); // L'image est la source
                					break;
                			case 2: //JPEG
                    			    $source = imagecreatefromjpeg($dest_dossier.$nom); // L'image est la source
               						break;
              				case 3: // PNG
                        			$source = imagecreatefrompng($dest_dossier.$nom); // L'image est la source
                					break;
        				}

						if($hauteur >= $limite_mini AND $hauteur > $largeur) // Calcule des dimensions miniatures
						{		// Si la hauteur est plus grande que la largeur

						$largeur = $largeur / ($hauteur / $limite_mini); // Calcule de la largeur miniature
						$hauteur = $limite_mini;
						}
						else
						{		// Si la largeur est plus grande que la hauteur

						$hauteur = $hauteur / ($largeur / $limite_mini); // Calcule de la hauteur miniature
						$largeur = $limite_mini;
						}

						$destination = imagecreatetruecolor($largeur, $hauteur); // On crée la miniature vide

						$largeur_source = imagesx($source); // Largeur de la source
						$hauteur_source = imagesy($source); // Hauteur de la source
						$largeur_destination = imagesx($destination); // Largeur de la miniature
						$hauteur_destination = imagesy($destination); // Hauteur de la miniature

						// Notez bien que l'on n'est pas obligé de faire ces calculs, car on les a déjà fait. Moi je préfère, pour plus de sureté

						$nomMiniature = 'small_'.$nom; // Nom de la miniature
						imagecopyresampled($destination, $source, 0, 0, 0, 0, $largeur_destination, $hauteur_destination, $largeur_source, $hauteur_source); // Création de la miniature

						switch ($extension) {
                			case 1: // GIF
                        		imagegif($destination, $dest_miniat.$nomMiniature);
                				break;
               			 	case 2: //JPEG
                        		imagejpeg($destination, $dest_miniat.$nomMiniature); 
               					break;
                			case 3: // PNG
                      		  imagepng ($destination, $dest_miniat.$nomMiniature); 
              					break;
						
							//on libere la memoire du serveur
							imagedestroy ($destination); 
						}
				} //  Fin de création de la miniature
				
			
						} // Fin de l'upload a marché
				
                else
				
			   {
                	$arrImg[$i]['message'] = 'Un problème est survenu dans la tentative de transfert de l\'image ' . $_FILES['photo']['name'][$i];
            		exit;
				} // FIn de l'uuload s'est plante
			
					
			
			} // FIn de on peut commencer l'upload    if( $arrImg[$i]['upload'] )
[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]

ViPHP
AB
ViPHP | 5818 Messages

11 déc. 2008, 02:05

Le fichier temporaire est normalement détruit à la fin du script. Mais si tu fais du traitement en boucle détruis le quand tu n'en a plus besoin ça libérera de la place pour les photos suivantes.

Pour remplacer tes accents évites d'utiliser strtr car ça posera des pb si tu passe à l'utf-8. Utilises plutôt str_replace et tu n'auras pas de souci si tu change l'encodage.

Sinon pour l'optimisation tu en connais une bonne partie puisque tu commentes toi-même du code redondant :wink:

Ensuite poses le tout sur un serveur distant et fais le test. Après ça tu saura si ça fonctionne vraiment.

Sinon, ben on ne vois pas les vérif que tu fais lors du chargement des fichiers donc RAS. Si tu ne l'a pas déjà fais et que tu veux un script vraiment complet regarde du coté de $_FILES['userfile']['error'] http://fr.php.net/manual/fr/features.fi ... errors.php pour la gestion des erreurs.

Eléphanteau du PHP | 31 Messages

11 déc. 2008, 19:31

Merci pour tous les conseils !

Et que me conseilles tu pour détruire le fichier temporaire ?
avec la fonction unlink("$_FILES['photo']['name'][$i]") ?

Merci !

ViPHP
ViPHP | 4674 Messages

11 déc. 2008, 20:25

Bien sûr : unlink() est la seule façon de procéder même.
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).