Bonjour,

Il y a une erreur dans le premier code de ce post. En effet je crée une fonction "Redim()" dans laquelle je fais un appel à une instance de la classe serveur avec "$up->exitErreurFichier('...')". Il faudrait préalablement passer cette variable comme paramètre dans la fonction pour pouvoir l'utiliser... En fait cela ne crée pas de bug car les erreurs de redimensionnements proviennent le plus souvent d'un dépassement de la mémoire et cette erreur est interceptée autrement, de même que le contrôle sur les extensions est effectuée avant.

Je donne ci-dessous une version corrigée et en même temps optimisée en terme de performance serveur pour un résultat visuel identique. C.f. commentaires en début de code pour plus de détails. Les gains peuvent être spectaculaires - plusieurs centaines de % ! - en fonction de la résolution de l'image originale et du nombre de redimensionnements successifs.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
<?php
/*UploadAjaxABCI_Php_Load_Redimensions.php Version 2.6
require 'UploadAjaxABCIServeur.php' et 'fctredimimage.php';

// Exemple de script php d'upload avec redimensionnement d'images. Voir "UploadAjaxABCI_Php_Load_Redimensions.php" pour plus de commentaires.

/* Ce script utilise la même fonction de redimensionnement que le script "UploadAjaxABCI_Php_Load_Redimensions.php".
Cependant, si l'on fait plusieurs redimensionnements successifs, on a intérêt de faire le redimensionnement de plus grande dimension en premier puis d'utiliser ce fichier pour faire les redimensionnements suivants en plus petites dimensions. Il n'y a pas de différence qualitative visuellement par contre le fait de travailler sur une image déjà réduite par rapport à l'original permet aux redimensionnements suivants d'utiliser beaucoup moins de ressources serveur. Le gain est très sensible et proportionnel à la résolution de l'image originale et au nombre de redimensionnements successifs.
*/
 
 
// Vous devez vérifier l'existence de ces dossiers ou changer ces adresses 
/*------------------------------------------------------*/
$dossier_destination = '../Destination_Upload/';
$dossier_temporaire = '../Upload_Temp/';
/*------------------------------------------------------*/
 
session_start();
 
ignore_user_abort(true);
 
header('Content-type: text/html; charset=UTF-8');
 
require 'UploadAjaxABCIServeur.php';
 
$up = new UploadAjaxABCIServeur($dossier_destination, $dossier_temporaire);
 
$tab_erreurs = array();
 
$tab_erreurs['Allowed memory size'] = "Mémoire insuffisante, le fichier est trop gros pour être redimensionné.";
 
$tab_erreurs['Maximum execution time'] = "Le temps d'exécution maximum du script est dépassé.";
 
$up->cathErreurServeur($tab_erreurs);
 
$unidid_form = $up->getUniqidForm();
 
if(!(isset($unidid_form,$_SESSION['UploadAjaxABCI'][$unidid_form]))) $up->exitErreurFichier("Connexion non valide ou perdue. Rafraîchissez la page et recharger votre fichier, si celui-ci dispose d'une sauvegarde automatique elle sera utilisée."); 
 
// S'assure qu'un fichier ou un fragment de fichier est en téléchargement
if($up->getFragment())
{
	$extensions_autorisees = array('jpg','jpeg','png');
 
	$nom_fichier_nettoye = $up->getFichierNomNettoye();
 
	$verif_extension = $up->VerifExtensions($nom_fichier_nettoye,$extensions_autorisees);
	if($verif_extension == false) 
	{
		$up->exitErreurFichier('Extension du fichier non valide.');
	}	
 
	// Upload dans le dossier temporaire
	$up->Upload();
 
	// Retourne l'adresse du fichier temporaire quand il est complet, sinon false
	$fichier_complet = $up->getFichierComplet();
	if($fichier_complet != false)
	{
		require 'fctredimimage.php';
 
		/*Si plusieurs redimensionnements on utilise les troisième et quatrième paramètre de la fonction "fctredimimage()" qui vont copier le fichier redimensionné dans le répertoire de destination et laisser intact le fichier original.
		Ci-dessous je crée une fonction qui réalise la redimension et impose le chmod au fichier de destination*/
		function Redim($L, $H, $dossier_dest=null, $nom_fichier=null, $dirname, $basename, $extension_fichier, $up)
		{
			$redim = fctredimimage($L, $H, $dossier_dest, $nom_fichier, $dirname, $basename, $extension_fichier);
 
			if(!$redim) 
			{			
				$up->exitErreurFichier("Erreur dans le redimensionnement du fichier.");
			}
 
			// On met le chmod si besoin (mini 0604 pour une lecture depuis une url externe) au cas où le serveur mette un 0600
			$destination_fichier = $dossier_dest.$nom_fichier;
			if(trim($destination_fichier) != '' && !@chmod($destination_fichier,0604))
			{
				$up->exitErreurFichier("Echec de la configuration des droits d'accès du fichier.");
			}
		}
 
		// Informations sur le fichier
		$pathinfo = pathinfo($nom_fichier_nettoye);
 
		$extension_fichier = strtolower($pathinfo['extension']);
 
		$non_fichier = $pathinfo['filename'];
 
		// On utilise l'adresse du fichier temporaire (fichier de travail) pour le passer en paramètre à la fonction de redimensionnement
		$basename = basename($fichier_complet);
		$dirname = dirname($fichier_complet).'/';
 
		// On défini l'adresse du dossier de destination par rapport au serveur (recommandé)
		$dossier_dest_serveur = $up->getAdresseRelative().$dossier_destination;
 
		/* On fait le plus grand redimensionnement en premier dans le répertoire temporaire en modifiant la source. Les redimensionnements suivants utiliseront cette image redimensionnée et donc moins de ressources serveur par rapport à l'image originale. Il faut bien entendu que les redimensionnments suivants soient de dimensions inférieures.*/
		Redim(1000, 800, '', '', $dirname, $basename, $extension_fichier, $up);
		// On construit l'adresse du premier fichier redimensionné pour le passer en paramètre à la fonction "Transfert()"
		$nom_fichier_max = $non_fichier.'_max.'.$extension_fichier;
		$destination_fichier = $dossier_dest_serveur.$nom_fichier_max;
 
		// Redimesionnements suivants en utilisant le premier comme source et en copiant le résultat dans le répertoire de destination (ne modifie pas la source)
		$nom_fichier_mini = $non_fichier.'_mini.'.$extension_fichier;
		Redim(200, 200, $dossier_dest_serveur, $nom_fichier_mini, $dirname, $basename, $extension_fichier, $up);
 
 
		// On peut faire d'autres redimensionnements sur le même principe tant qu'on ne dépasse pas la résolution du plus grand redimensionnement fait en premier (1000x800 dans cet exemple)
		$nom_fichier_moyen = $non_fichier.'_moyen.'.$extension_fichier;
		Redim(500, 400, $dossier_dest_serveur, $nom_fichier_moyen, $dirname, $basename, $extension_fichier, $up);
 
 
		// La fonction transfert le fichier temporaire vers son emplacement définitif (retourne true si ok). 
		$transfert = $up->Transfert($destination_fichier);
 
		// On défini le chmod (si besoin)
		if($transfert && !@chmod($destination_fichier,0604))
		{
			$up->exitErreurFichier("Echec de la configuration des droits d'accès du fichier");
		}
	}
}
$up->exitReponseAjax();
?>
Ces exemples ont été mis à jour dans la version 2.6 de la classe.

J'en ai profité pour modifier la classe javascript pour pouvoir (si besoin) ajouter dans le formulaire des champs input avec la notation tableau. Ils seront passés automatiquement côté php. Précédemment on ne pouvait ajouter que des champs avec la notation simple, les champs avec la notation tableau n'étaient pas transmis.
Dans tous les cas si vous ajoutez des champs dans le formulaire n'oubliez pas d'utiliser la fonction urldecode $mon_input = urldecode($_POST['mon_input']) pour récupérer les valeurs en php (indispensable pour récupérer des caractères spéciaux ou accentués).