Upload multiple image gif/jpg/png avec rotation, miniature gardant les proportions et ajout d'un copyright

Soyez le premier à donner votre avis sur cette source.

Vue 35 412 fois - Téléchargée 3 526 fois

Description

Alors voilà,

Maintenant que j'ai assez profité de toutes les astuces que fournis ce site, je me suis dit que je pouvais essayer d'aider les autres.

J'ai cherché pendant longtemps un upload bien expliqué, et pour finir je me le suis fait moi-même ;) en cherchant sur le site de php.net. De plus j'ai aussi fait en sorte qu'il redimensionne direct l'image comme désiré.

Dans le zip il y a 2 fichiers d'upload un permettant une miniature qui garde les proportions de l'originale et l'autre qui crée une miniature aux dimension données, déformant l'original.
J'y ai maintenant rajouté un fichier avec formulaire su rla page .php qui permet d'uploader plusieurs fichiers en une fois :D

Etant un programmeur amateur, je vous demanderai de bien vouloir être indulgents.

Source / Exemple :


index.php :
-----------
<html>
<head>
<title>Upload</title>
</head>

<body>
<form method="post" action="upload.php" enctype="multipart/form-data">

<?php
$nbr_champs = 10;
for($nbr=0;$nbr<$nbr_champs;$nbr++){
?>

  <?php echo $nbr; ?>. <input type="file" name="fichier_upload_<?php echo $nbr; ?>" id="fichier_upload_<?php echo $nbr; ?>"><br />
  <select name="fichier_rotation_<?php echo $nbr; ?>">
    <option>Pas de rotation</option>
    <option value="90">90° gauche</option>
    <option value="270">90° droite</option>
    <option value="180">180°</option>
  </select>
  <br />

<?php
}
?>

  <input type="submit" name="Submit" value="Uploader">
  <input name="nbr_f" type="hidden" value="<?php echo $nbr_champs; ?>">
</form>
</body>
</html>

upload.php :
---------------------------------------
<?php
// nombre de fichiers à uploader
$nbr_fichiers = $_POST['nbr_f'];

// boucle permettant d'uploader les fichiers un à un
for($nbr=0;$nbr<$nbr_fichiers;$nbr++){

// on récupère les infos du fichier à uploader
$fichier_temp = $_FILES['fichier_upload_'.$nbr]['tmp_name'];
$fichier_nom = $_FILES['fichier_upload_'.$nbr]['name'];

// on défini les dimensions et le type du fichier
list($fichier_larg, $fichier_haut, $fichier_type, $fichier_attr)=getimagesize($fichier_temp);

// infos de contrôle du fichier
$fichier_poids_max = 500000;
$fichier_h_max = 1224;
$fichier_l_max = 1632;

// gestion du copyright
// 0 = pas de copyright
// 1 = ajout d'un copyright sur les images uploadées
// 2 = ajout d'un copyright sur les images uploadées
//     mais tout en gardant une copie de l'image originale sans le copy.
$copyright = 2;
$opacite = 100;

// source du logo copyright
// ATTENTION si vous voulez utiliser un logo au format .jpg ou .png aucun soucis
// il suffit de remplacer imagecreatefromgif par imagecreatefromjpeg ou imagecreatefrompng
$copyright_logo = imagecreatefromgif('logo.gif');

// dossier de destination
$fichier_dossier = 'images/';

// extension du fichier
$fichier_ext = substr($fichier_nom,strrpos( $fichier_nom, '.')+1);

// on renomme le fichier
$fichier_date = date("ymdhis");
$fichier_n_nom = $nbr."_".$fichier_date.".".$fichier_ext;

	// on vérifie s'il y a bien un fichier à uploader
	if (!empty($fichier_temp) && is_uploaded_file($fichier_temp)) {
	
		// on vérifie le poids du fichier
		if (filesize($fichier_temp)<$fichier_poids_max) {
		
			// types de fichiers autorises 1=gif / 2=jpg / 3=png
			if (($fichier_type===1) || ($fichier_type===2) || ($fichier_type===3)) {
			
				// on vérifie si l'image n'est pas trop grande
				if (($fichier_larg<=$fichier_l_max) && ($fichier_haut<=$fichier_h_max)) {
				
					// si le fichier est ok, on l'upload sur le serveur
					if (move_uploaded_file($fichier_temp, $fichier_dossier.$fichier_n_nom)) {
					
						// on donne un acces total sur le fichier
						chmod ($fichier_dossier.$fichier_n_nom, 0777);
						
							/******************
							rotation de l'image

                                    • /
if (!empty($_POST['fichier_rotation_'.$nbr]) && is_numeric($_POST['fichier_rotation_'.$nbr])) { $degre_rotation = $_POST['fichier_rotation_'.$nbr]; $image = getimagesize($fichier_dossier.$fichier_n_nom); // création de l'image if($fichier_type == "1") { $source = imagecreatefromgif($fichier_dossier.$fichier_n_nom); } if($fichier_type == "2") { $source = imagecreatefromjpeg($fichier_dossier.$fichier_n_nom); } if($fichier_type == "3") { $source = imagecreatefrompng($fichier_dossier.$fichier_n_nom); } //rotation de l'image $rotation = imagerotate($source,$degre_rotation,1); //Le -1 permet de remplir les zones vides avec du transparent // sauvegarde de l'image finale if($fichier_type == "1") { imagegif($rotation,$fichier_dossier.$fichier_n_nom); } if($fichier_type == "2") { imagejpeg($rotation,$fichier_dossier.$fichier_n_nom); } if($fichier_type == "3") { imagepng($rotation,$fichier_dossier.$fichier_n_nom); } if (($degre_rotation == '90') || ($degre_rotation == '270')) { $n_larg = $fichier_haut; $n_haut = $fichier_larg; $fichier_larg = $n_larg; $fichier_haut = $n_haut; } } /***************************** ajout d'un copyright sur les photos
                                                          • /
if ($copyright == 0) { // pas d'ajout de copyright } elseif ($copyright != 0) { // source de la photo if ($fichier_type===1) { $copyright_photo = imagecreatefromgif($fichier_dossier.$fichier_n_nom); } elseif ($fichier_type===2) { $copyright_photo = imagecreatefromjpeg($fichier_dossier.$fichier_n_nom); } else { $copyright_photo = imagecreatefrompng($fichier_dossier.$fichier_n_nom); } // on récupère les dimensions du logo et de la photo $larg_logo = imagesx($copyright_logo); $haut_logo = imagesy($copyright_logo); $larg_photo = imagesx($copyright_photo); $haut_photo = imagesy($copyright_photo); // on calcule la position du logo, ici en bas à droite $poslogo_x = $larg_photo - ($larg_logo + 5); $poslogo_y = $haut_photo - ($haut_logo + 5); // on colle le logo au dessus de l'image imagecopymerge($copyright_photo, $copyright_logo, $poslogo_x, $poslogo_y, 0, 0, $larg_logo, $haut_logo, $opacite); // si 1, on écrase l'image sans copyright if ($copyright == 1) { if ($fichier_type===1) { imagegif($copyright_photo, $fichier_dossier.$fichier_n_nom); } elseif ($fichier_type===2) { imagejpeg($copyright_photo, $fichier_dossier.$fichier_n_nom); } else { imagepng($copyright_photo, $fichier_dossier.$fichier_n_nom); } } // si 2, on crée une nouvelle image avec le copyright else { if ($fichier_type===1) { imagegif($copyright_photo, $fichier_dossier.'c_'.$fichier_n_nom); } elseif ($fichier_type===2) { imagejpeg($copyright_photo, $fichier_dossier.'c_'.$fichier_n_nom); } else { imagepng($copyright_photo, $fichier_dossier.'c_'.$fichier_n_nom); } } } /******************** création de la miniature
                                        • /
// dimension maximale largeur et hauteur comprise $taille_max = 100; // si le fichier est plus grand que $taille_max on le miniaturise if (($fichier_larg > $taille_max) || ($fichier_haut > $taille_max)) { // définition des dimensions if (($fichier_haut > $taille_max) && ($fichier_haut >> $fichier_larg)) { $mini_haut = $fichier_haut / ($fichier_larg / $taille_max); $mini_larg = $taille_max; } else { $mini_haut = $taille_max; $mini_larg = $fichier_larg / ($fichier_haut / $taille_max); } // si le fichier est un .gif if ($fichier_type === 1){ // definition de l'image dont on va faire une miniature $fichier_source = imagecreatefromgif($fichier_dossier.$fichier_n_nom); // on prépare le fichier miniature qui accueillera l'image réduite $fichier_reduit = imagecreate($mini_larg, $mini_haut); // fond blanc pour l'image $fond_blanc = imagecolorallocate($fichier_reduit, 255, 255, 255); // dimensions x et y à donner au fichier $fichier_larg_red = imagesx($fichier_reduit); $fichier_haut_red = imagesy($fichier_reduit); // on rajoute un mini_ defant le nom du fichier $nom_fichier_reduit = 'mini_'.$fichier_n_nom; // on redimensionne l'image de base dans le fichier $fichier_reduit imagecopyresampled($fichier_reduit, $fichier_source, 0, 0, 0, 0, $fichier_larg_red, $fichier_haut_red, $fichier_larg, $fichier_haut); // on rend transparent le fond blanc imagecolortransparent($fichier_reduit, $fond_blanc); // crée le fichier réduit définitif imagegif($fichier_reduit, $fichier_dossier.$nom_fichier_reduit); // on donne un acces total sur le fichier chmod($fichier_dossier.$nom_fichier_reduit, 0777); } // si le fichier est un .jpg / .jpeg if ($fichier_type===2){ // définition de la qualité $qualite=80; // definition de l'image dont on va faire une miniature $fichier_source = imagecreatefromjpeg($fichier_dossier.$fichier_n_nom); // on prépare le fichier miniature qui accueillera l'image réduite $fichier_reduit = imagecreatetruecolor($mini_larg, $mini_haut); // dimensions x et y à donner au fichier $fichier_larg_red = imagesx($fichier_reduit); $fichier_haut_red = imagesy($fichier_reduit); // on rajoute un mini_ defant le nom du fichier $nom_fichier_reduit = 'mini_'.$fichier_n_nom; // on redimensionne l'image de base dans le fichier $fichier_reduit imagecopyresampled($fichier_reduit, $fichier_source, 0, 0, 0, 0, $fichier_larg_red, $fichier_haut_red, $fichier_larg, $fichier_haut); // crée le fichier réduit définitif imagejpeg($fichier_reduit, $fichier_dossier.$nom_fichier_reduit, $qualite); // on donne un acces total sur le fichier chmod($fichier_dossier.$nom_fichier_reduit, 0777); } // si le fichier est un .png if ($fichier_type===3){ // definition de l'image dont on va faire une miniature $fichier_source = imagecreatefrompng($fichier_dossier.$fichier_n_nom); // on prépare le fichier miniature qui accueillera l'image réduite $fichier_reduit = imagecreatetruecolor($mini_larg, $mini_haut); // dimensions x et y à donner au fichier $fichier_larg_red = imagesx($fichier_reduit); $fichier_haut_red = imagesy($fichier_reduit); // on rajoute un mini_ defant le nom du fichier $nom_fichier_reduit = 'mini_'.$fichier_n_nom; // on redimensionne l'image de base dans le fichier $fichier_reduit imagecopyresampled($fichier_reduit, $fichier_source, 0, 0, 0, 0, $fichier_larg_red, $fichier_haut_red, $fichier_larg, $fichier_haut); // crée le fichier réduit définitif imagepng($fichier_reduit, $fichier_dossier.$nom_fichier_reduit); // on donne un acces total sur le fichier chmod($fichier_dossier.$nom_fichier_reduit, 0777); } // si le fichier est plus petit que $taille_max pas besoin de le miniaturiser } else { $nom_fichier_reduit = $fichier_n_nom; } /************************************* enregistrement dans la base de données nom du fichier non réduit : ---------------------------------- $fichier_n_nom nom du fichier réduit : ---------------------------------- $nom_fichier_reduit
                                                                          • /
echo "Le fichier n°".$nbr." a été uploadé avec succès<br />"; } else { echo "Le fichier n°".$nbr." n'a pas pu être uploadé<br />"; } } else { echo "Le fichier n°".$nbr." est trop grand<br />"; } } else { echo "Le fichier n°".$nbr." n'a pas le bon format<br />"; } } else { echo "Le fichier n°".$nbr." est trop lourd<br />"; } } else { echo "Pas de fichier à uploader dans le champ n°".$nbr."<br />"; } } ?>

Conclusion :


J'ai réussi à modifier de façon à pouvoir uploader plusieurs fichiers, comme on dit, quand on cherche on trouve :D

Good bye all, et merci.

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

jako46
Messages postés
1
Date d'inscription
mercredi 6 avril 2011
Statut
Membre
Dernière intervention
16 mai 2011
-
Super le script! Bravo! Moi j'obtient
Warning: getimagesize() [function.getimagesize]: Filename cannot be empty in /home/........./upload_mini_proportionnee_rotation.php on line 13
Pas de fichier à uploader dans le champ n°1

Quelqu'un sais comment regler cela?
D1stort1on
Messages postés
57
Date d'inscription
samedi 11 janvier 2003
Statut
Membre
Dernière intervention
30 janvier 2010
-
@ L_NICO :
Salut,

pour enregistrer plusieurs photos uploadées, tu dois mettre ta requête dans la boucle, là ou j'ai noté l'emplacement. Les images sont uploadées les unes après les autres, ce qui fait que tu ne peux pas les enregistrer comme sur ta requête. Chaque image sera un nouvel enregistrement dans ta base de données.

@ DIDINE1975 :
Merci pour le commentaire, pour ce qui est de ta solution, je ne l'ai pas testé et pas eu le temps de chercher la solution, mais merci de le proposer aux autres ;)

@ Vickilux :
Je ne comprend pas vraiment ton but. Le script tourne le nombre de fois qu'il y a de photos, donc si tu effectues une vérification des champs avant d'envoyer au script d'upload, tu peux définir le nombre juste de fois ou le script s'exécutera. C'est le champ caché "> qui renseigne le script d'upload concernant le nombre de boucle à effectuer.

Pour ce qui est du fichier .png, il faut que je regarde. J'ai aussi des soucis concernant les .gif transparents.
cs_didine1975
Messages postés
1
Date d'inscription
jeudi 15 octobre 2009
Statut
Membre
Dernière intervention
16 juillet 2010
-
bonjour,
avant tout merci pour ce script, les commentaires toutes au long du code et le suivi.
je viens de le mettre en place et tout comme MOON22, j'ai voulu conserver le nom d'origine des images, j'ai également vu apparaitre une double extension, j'ai juste retiré l'ajout de l'extension, puisqu'elle est déjà récupérée avec le nom de l'image (je suis super novice en php, donc je ne garantie pas la solution, mais personnellement ça ne m'a généré aucune erreur, et ça n'a pas l'air d'avoir d'incidence ailleurs)

à la ligne:
$fichier_n_nom = $nbr."_".$fichier_date."_".$fichier_nom.".".$fichier_ext;

j'enlève l'ajout de l'extension, ce qui donne :
$fichier_n_nom = $nbr."_".$fichier_date."_".$fichier_nom;

Voilà si ça peut aider quelqu'un...
et encore RESPECTS pour l'auteur.
Audrey
l_nico
Messages postés
1
Date d'inscription
mercredi 13 avril 2005
Statut
Membre
Dernière intervention
11 mars 2010
-
Bonjour,
merci ce script est génial.
Par contre je me heurte à l'enregistrement des images dans ma BDD.
Je n'arrive pas a comprendre comment enregistrer plus d'une image dans une BDD
J'ai compris que le nom que prend l'image uploadée est définie par la variable '$fichier_n_nom'

voici ma requete:

$query = "INSERT INTO $table VALUES ('', '$nom', '$prenom','$fichier_n_nom','là l'image 2,'là l'image 3)";


c'est précisément l'image 2 et l'image 3que je n'arrive pas a recuperé.

Quelqu'un sait-il ?

merci
Vickilux
Messages postés
2
Date d'inscription
vendredi 22 janvier 2010
Statut
Membre
Dernière intervention
30 janvier 2010
-
Bonjour,

J’ai une image au format logo.png avec fond transparent que je voudrais utiliser pour le copyright de la photo, mais quand la photo est créé, alors le logo.png qui est coller dessus est devenu opaque, cependant je voudrais garder la transparence ! Si quelqu’un peut m’aider merci beaucoup !

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.