IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Téléchargez Discussion :

Upload de gros fichiers par fragments (chunk)


Sujet :

Téléchargez

  1. #161
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Salut,

    Après des recherches plus approfondies, le bug est identifié ici et cela semble affecter plus particulièrement les selfies en provenance des smartphones Samsung.

    Par chance c'est assez facile à réparer en désactivant les avertissements de la lib gd pour les fichiers de type jpg comme l'indique le rapport de bug php dans le lien ci-dessus.

    Donc, dans le répertoire Php_Upload/Classes/ remplace le contenu des fichiers CropRedim.php et RedimImage.php par les codes suivants :

    CropRedim.php :
    Code php : 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
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    <?php
    abstract class CropRedim
    {
    	private static $ignore_warning_gd;
     
    	public static function Param($W_max, $H_max, $rep_Dst, $img_Dst, $rep_Src, $img_Src, $ext, $W_Src, $H_Src, $x, $y, $crop) 
    	{
    		// Désactive le rapport d'erreurs de la lib gd qui renvoie des erreurs avec certaines images jpg provenant des selfies 
    		if(self::$ignore_warning_gd == NULL) 
    		{
    			ini_set ('gd.jpeg_ignore_warning', true);
    			self::$ignore_warning_gd = 1;
    		}
     
    		// Initialise les messages serveur contenus dans "Classes/Messages.php"
    		new SetMessages('redimCrop');
     
    		try 
    		{
    			// Suppose une image valide. Si les paramètres $W_max et $H_max sont égaux à zéro et $crop = false (si l'on a pas défini de dimensions maximales et que l'image n'a pas été cropée), l'image n'est pas modifiée.
     
    			// Si certains paramètres ont pour valeur '' :
    			$rep_Dst = $rep_Dst == '' ? $rep_Src : $rep_Dst; // (même répertoire)
    			$img_Dst = $img_Dst == '' ? $img_Src : $img_Dst; // (même nom)
     
    			$ext_redim = ['jpg','jpeg','png','gif'];
     
    			if(!in_array($ext,$ext_redim)) throw new Exception(SetMessages::setMess('UpAbExtensionFichier'));
     
    			// ------------------------
    			// condition de redimensionnement et dimensions de l'image finale
    			// ------------------------		
     
    			// A- LARGEUR ET HAUTEUR maxi fixes
    			$condition = false;
     
    			if ($W_max != 0 && $H_max != 0) 
    			{
    				$ratiox = $W_Src / $W_max; // ratio en largeur
    				$ratioy = $H_Src / $H_max; // ratio en hauteur
    				$ratio = max($ratiox,$ratioy); // le plus grand
     
    				$W = $W_Src/$ratio;
    				$H = $H_Src/$ratio;   
    				$condition = ($W_Src > $W_max) || ($H_Src > $H_max); // true si vrai 
    			}
    			else //  B- HAUTEUR maxi fixe
    			if ($W_max == 0 && $H_max != 0) 
    			{
    				$H = $H_max;
    				$W = $H * ($W_Src / $H_Src);
    				$condition = ($H_Src > $H_max); // true si vrai 
    			}
    			else //  C- LARGEUR maxi fixe
    			if ($W_max != 0 && $H_max == 0) 
    			{
    				$W = $W_max;
    				$H = $W * ($H_Src / $W_Src);         
    				$condition = ($W_Src > $W_max); // true si vrai
    			}
     
    			if(!$condition)
    			{
    				$W = $W_Src;
    				$H = $H_Src;
    			}
     
     
    			$Ress_Src = null;
     
    			if ($W_max != 0 || $H_max != 0 || $crop)
    			{
    				switch($ext) 
    				{
    					case 'jpg':
    					case 'jpeg': $Ress_Src = @imagecreatefromjpeg($rep_Src.$img_Src); break;
     
    					case 'png': $Ress_Src = @imagecreatefrompng($rep_Src.$img_Src);
    										if (!($condition || $crop) && is_resource($Ress_Src))
    										{
    											@imagealphablending($Ress_Src, false);
    											@imagesavealpha($Ress_Src, true);
    										}
    										break;
     
     
    					case 'gif': $Ress_Src = @imagecreatefromgif($rep_Src.$img_Src); break;		
     
    					default : $Ress_Src = null;
    				}	
     
    				if(!is_resource($Ress_Src)) throw new Exception(SetMessages::setMess('UpAbImageCreationSource'));
    			}
     
    			if ($condition || $crop)
    			{
    				// creation d une ressource-image "Dst" aux dimensions finales
    				// fond noir (par defaut)
    				switch($ext) 
    				{
    					case 'gif':
    					case 'jpg':
    					case 'jpeg': 	$Ress_Dst = @imagecreatetruecolor(round($W),round($H));
    									break;
     
    					case 'png': 	$Ress_Dst = @imagecreatetruecolor(round($W),round($H));
    									if(is_resource($Ress_Dst))
    									{
    										// fond transparent (pour les png avec transparence)
    										@imagealphablending($Ress_Dst, false);
    										@imagesavealpha($Ress_Dst, true);
    										$trans_color = @imagecolorallocatealpha($Ress_Dst, 0, 0, 0, 127);
    										@imagefill($Ress_Dst, 0, 0, $trans_color);
    									}
    									break;
     
    					default : $Ress_Dst = null;
    				}
     
    				if(!is_resource($Ress_Dst)) throw new Exception(SetMessages::setMess('UpAbImageCreationDestination'));
     
    				$redim = @imagecopyresampled($Ress_Dst, $Ress_Src, 0, 0, round($x), round($y), round($W), round($H), round($W_Src), round($H_Src)); 	
    				if ($redim == false) throw new Exception(SetMessages::setMess('UpAbImageRedimension'));
    			}
    			else
    			{
    				$Ress_Dst = $Ress_Src;
    			}
     
    			// ENREGISTREMENT dans le repertoire (avec la fonction appropriee)
    			if ($W_max != 0 || $H_max != 0 || $crop)
    			{
    				switch ($ext) 
    				{ 
    					case 'jpg':
    					case 'jpeg': $image = @imagejpeg ($Ress_Dst, $rep_Dst.$img_Dst, 90); break;
    					case 'png': $image = @imagepng ($Ress_Dst, $rep_Dst.$img_Dst,1); break;
    					case "gif" : $image = @imagegif($Ress_Dst, $rep_Dst.$img_Dst); break;
     
    					default : $image = false;
    				}
     
    				if ($image == false) throw new Exception(SetMessages::setMess('UpAbImageEnregistrement'));
    			}
     
    			// ------------------------
    			// liberation des ressources-image
    			@imagedestroy ($Ress_Src);
    			@imagedestroy ($Ress_Dst);
     
    			return true;
    		}
    		catch (Exception $e) 
    		{
    			return $e->getMessage();
    		}
    	}
    }
    ?>

    RedimImage.php :
    Code php : 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
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    <?php 
    // © Jérome Réaux : http://j-reaux.developpez.com - http://www.jerome-reaux-creations.fr   (modifiée)
    // ---------------------------------------------------
    // Fonction de REDIMENSIONNEMENT physique "PROPORTIONNEL" et Enregistrement 
    // ---------------------------------------------------
    // retourne : true si le redimensionnement et l'enregistrement ont bien eu lieu, sinon un message textuel
    // ---------------------
    // La FONCTION : RedimImage ($W_max, $H_max, $rep_Dst, $img_Dst, $rep_Src, $img_Src)
    // Les paramètres :
    // - $W_max : LARGEUR maxi finale --> ou 0
    // - $H_max : HAUTEUR maxi finale --> ou 0
    // - $rep_Dst : repertoire de l'image de Destination (déprotégé) --> ou '' (même répertoire)
    // - $img_Dst : NOM de l'image de Destination --> ou '' (même nom que l'image Source)
    // - $rep_Src : repertoire de l'image Source (déprotégé)
    // - $img_Src : NOM de l'image Source
    // ---------------------
    // 3 options :
    // A- si $W_max!=0 et $H_max!=0 : a LARGEUR maxi ET HAUTEUR maxi fixes
    // B- si $H_max!=0 et $W_max==0 : image finale a HAUTEUR maxi fixe (largeur auto)
    // C- si $W_max==0 et $H_max!=0 : image finale a LARGEUR maxi fixe (hauteur auto)
    // Si l'image Source est plus petite que les dimensions indiquées : PAS de redimensionnement.
    // ---------------------
    // $rep_Dst : il faut s'assurer que les droits en écriture ont été donnés au dossier (chmod)
    // - si $rep_Dst = ''   : $rep_Dst = $rep_Src (même répertoire que l'image Source)
    // - si $img_Dst = '' : $img_Dst = $img_Src (même nom que l'image Source)
    // - si $rep_Dst='' ET $img_Dst='' : on ecrase (remplace) l'image source !
    // ---------------------
    // NB : $img_Dst et $img_Src doivent avoir la meme extension (meme type mime) !
    // Extensions acceptées (traitees ici) : .jpg , .jpeg , .png
    // Pour Ajouter d autres extensions : voir la bibliotheque GD ou ImageMagick
    // (GD) NE fonctionne PAS avec les GIF ANIMES ou a fond transparent !
    // ---------------------
    // UTILISATION (exemple) :
    // $redimOK = RedimImage(120,80,'reppicto/','monpicto.jpg','repimage/','monimage.jpg','jpg');
    // if ($redimOK==true) { echo 'Redimensionnement OK !';  }
    // ---------------------------------------------------
     
    abstract class RedimImage
    {
    	private static $ignore_warning_gd;
     
    	public static function Param($W_max, $H_max, $rep_Dst, $img_Dst, $rep_Src, $img_Src, $extension_Src) 
     	{
                    // Désactive le rapport d'erreurs de la lib gd qui renvoie des erreurs avec certaines images jpg provenant des selfies
    		if(self::$ignore_warning_gd == NULL) 
    		{
    			ini_set ('gd.jpeg_ignore_warning', true);
    			self::$ignore_warning_gd = 1;
    		}
     
    		// Initialise les messages serveur contenus dans "Classes/Messages.php"
    		new SetMessages('redimCrop');
     
    		try 
    		{
     
    			//Suppose une image valide. Si l'image n'est pas redimensionnée, elle est simplement optimisée pour le web avec une qualité de 90
     
    			$condition = false;
    			// Si certains paramètres ont pour valeur '' :
    			if ($rep_Dst=='') { $rep_Dst = $rep_Src; } // (même répertoire)
    			if ($img_Dst=='') { $img_Dst = $img_Src; } // (même nom)
     
    			$ext_redim = ['jpg','jpeg','png','gif'];
     
    			if(!in_array($extension_Src,$ext_redim)) throw new Exception(SetMessages::setMess('UpAbExtensionFichier'));
    			// ---------------------
     
    			// récupération des dimensions de l'image Src
    			$img_size = @getimagesize($rep_Src.$img_Src);
    			$W_Src = $img_size[0]; // largeur
    			$H_Src = $img_size[1]; // hauteur
     
    			if(empty($W_Src) || empty($H_Src)) throw new Exception(SetMessages::setMess('UpAbImageDimensions'));
    			// ------------------------
    			// condition de redimensionnement et dimensions de l'image finale
    			// ------------------------
    			// A- LARGEUR ET HAUTEUR maxi fixes
    			if ($W_max!=0 && $H_max!=0) 
    			{
    				$ratiox = $W_Src / $W_max; // ratio en largeur
    				$ratioy = $H_Src / $H_max; // ratio en hauteur
    				$ratio = max($ratiox,$ratioy); // le plus grand
    				$W = $W_Src/$ratio;
    				$H = $H_Src/$ratio;   
    				$condition = ($W_Src > $W) || ($H_Src > $H); //  si vrai : true
    			}
    			else //  B- HAUTEUR maxi fixe
    			if ($W_max==0 && $H_max!=0) 
    			{
    				$H = $H_max;
    				$W = $H * ($W_Src / $H_Src);
    				$condition = ($H_Src > $H_max); // si vrai : true
    			}
    			else //  C- LARGEUR maxi fixe
    			if ($W_max!=0 && $H_max==0) 
    			{
    				$W = $W_max;
    				$H = $W * ($H_Src / $W_Src);         
    				$condition = ($W_Src > $W_max); // si vrai : true
    			}
     
    			switch($extension_Src) 
    			{
    				case 'jpg':
    				case 'jpeg': $Ress_Src = @imagecreatefromjpeg($rep_Src.$img_Src); 
    										 break;
     
    				case 'png': $Ress_Src = @imagecreatefrompng($rep_Src.$img_Src);
    									if(!$condition && is_resource($Ress_Src))
    									{
    										@imagealphablending($Ress_Src, false);
    										@imagesavealpha($Ress_Src, true);
    									}
    										break;
     
    				case 'gif': $Ress_Src = @imagecreatefromgif($rep_Src.$img_Src); 
    										break;	
     
    				default : $Ress_Src = null;
    			}
     
    			if(!is_resource($Ress_Src)) throw new Exception(SetMessages::setMess('UpAbImageCreationSource'));
     
    			// ---------------------------------------------
    			// REDIMENSIONNEMENT si la condition est vraie
    			// ---------------------------------------------
    			// - Si l'image Source est plus petite que les dimensions indiquées :
    			// Par defaut : PAS de redimensionnement mais optimisation pour le web
    			// On peut "forcer" le redimensionnement pour agrandissement en ajoutant ici :
    			// $condition = 1; (risque de perte de qualité)
     
    			// creation de la ressource-image "Src" en fonction de l'extension
     
     
    			if ($condition) 
    			{
    				// creation d une ressource-image "Dst" aux dimensions finales
    				// fond noir (par defaut)
    				switch($extension_Src) 
    				{
    					case 'gif':
    					case 'jpg':
    					case 'jpeg': 	$Ress_Dst = @imagecreatetruecolor(round($W),round($H));
    									break;
     
    					case 'png': 	$Ress_Dst = @imagecreatetruecolor(round($W),round($H));
    									if(is_resource($Ress_Dst))
    									{
    										// fond transparent (pour les png avec transparence)
    										@imagealphablending($Ress_Dst, false);
    										@imagesavealpha($Ress_Dst, true);
    										$trans_color = @imagecolorallocatealpha($Ress_Dst, 0, 0, 0, 127);
    										@imagefill($Ress_Dst, 0, 0, $trans_color);
    									}
    									break;
     
    					default : $Ress_Dst = null;
    				}
     
    				if(!is_resource($Ress_Dst)) throw new Exception(SetMessages::setMess('UpAbImageCreationDestination'));
     
    				// REDIMENSIONNEMENT (copie, redimensionne, re-echantillonne)
    				$redim = @imagecopyresampled($Ress_Dst, $Ress_Src, 0, 0, 0, 0, round($W), round($H), round($W_Src), round($H_Src)); 
    				if ($redim == false) throw new Exception(SetMessages::setMess('UpAbImageRedimension'));
    			}
    			else
    			{
    				$Ress_Dst = $Ress_Src;
    			}
     
    			// ENREGISTREMENT dans le repertoire (avec la fonction appropriee)
    			switch ($extension_Src) 
    			{ 
    				case 'jpg':
    				case 'jpeg': $image = @imagejpeg ($Ress_Dst, $rep_Dst.$img_Dst, 90); break;
    				case 'png': $image = @imagepng ($Ress_Dst, $rep_Dst.$img_Dst,1); break;
    				case "gif" : $image = @imagegif($Ress_Dst, $rep_Dst.$img_Dst); break;
     
    				default : $image = false;
    			}
     
    			if ($image == false) throw new Exception(SetMessages::setMess('UpAbImageEnregistrement'));
    			// ------------------------
    			// liberation des ressources-image
    			@imagedestroy ($Ress_Src);
    			@imagedestroy ($Ress_Dst);
     
    			return true;
    		} 
    		catch (Exception $e) 
    		{
    			return $e->getMessage();
    		}
    	}	
    }
    ?>

    Chez moi avec ces modifications, tes deux fichiers photos (frontal et arriere) peuvent être redimensionnés sans problème. Dis-moi ce qu'il en est chez toi après avoir remplacé le contenu des deux fichiers originaux par les codes ci-dessus.

    Je ferai une mise à jour du module d'upload dans les prochains jours avec ces corrections.

  2. #162
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 16
    Points : 22
    Points
    22
    Par défaut
    slt Alain,

    tu as trouvé le bug, et ça fonctionne sans aucun problème.
    bravo à toi pour ta réactivité.

  3. #163
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Bonjour,

    La version 6.6 est disponible

    1/ Modification des classes optionnelles de traitement d'images dans les fichiers :
    - CropRedim.php
    - RedimImage.php
    Corrige le bug retourné par la fonction native imagecreatefromjpeg - détail ici - sur des photos non entièrement conformes au standard en provenance de certains appareils photo numériques (typiquement selfies Samsung), ce qui rendait impossible les redimensionnements et recadrages sur ces images.

    2/ Amélioration de l'affichage du mode d'emploi pour une meilleure stabilité au chargement de la page (auparavant les blocs prenaient souvent une fraction de seconde pour se positionner correctement), et quelques améliorations mineures dans les css de certains fichiers d'exemples.

    Voilà

  4. #164
    Futur Membre du Club
    Homme Profil pro
    Agent de développement (animateur MJC)
    Inscrit en
    Décembre 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Agent de développement (animateur MJC)
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Décembre 2017
    Messages : 6
    Points : 6
    Points
    6
    Par défaut Beaucoup d'outils, lequel prendre ?
    Bonjour Alain,

    Tout d'abord, bravo et merci pour cet outil d'une rigueur et d'une efficacité à toute épreuve !
    ...
    Petit problème pour moi, c'est que c'est trop rigoureux et efficace pour moi ...

    J'explique : je code à mes heures perdues depuis quelques temps en autodidacte, et aujourd'hui j'ai besoin de cette compétence pour l'association où je travaille. Problème : la POO, j'ai survolé dans les bouquins sans jamais vraiment la mettre en œuvre. Le JS... bah c'est sensiblement la même chose !

    Du coup, j'ai été heureux de trouver ton fabuleux outil et les possibilités qu'il offre à partir des fichiers d'exemples. J'ai mis pas mal de temps à comprendre la logique, comment les choses s'emboîtaient les unes aux autres, mais je pense avoir désormais compris dans les grandes lignes.

    Maintenant, le problème pour moi, c'est de retrouver dans cette grande boîte à outil ceux qui correspondent à mon besoin (histoire que j'évite de visser avec un marteau).

    Le plus simple, c'est que je mette la procédure de ce que je veux faire :

    Procédure :
    - Choix de un ou plusieurs fichiers (multiple uploads = champ input file)
    - Vérification des extensions (config.js)
    - Renommage de chaque fichier uploadé possible avec un champ input text "fichier_nom"
    Cas 1 : Si "fichier_nom" renseigné, alors enregistrement de ce nom dans la base de données en tant que désignation du fichier pour le membre, càd nom qu'il verra dans son espace de stockage
    (Message d'erreur si le nom est trop long)
    Cas 2 : Si "fichier_nom" vide, alors enregistrement du nom original du fichier dans la base de données
    - Re-sélection de fichiers possible après avoir déjà choisi et/ou renommé des fichiers à uploader.
    Si le fichier a déjà été sélectionné, renommé, et/ou que le chargement a déjà été en partie fait, il apparaît toujours dans la liste après une nouvelle sélection de fichier, et le nom éventuellement donné est toujours renseigné
    - Nettoyage du nom du fichier pour l'upload et le transfert
    - Création du nom de fichier définitif : (AAMMJJ)-(ID_MEMBRE)-(NOM_FICHIER)-v1.ext
    - Si le fichier est une image, redimensionnement pour réduire si elle est trop grande (+ de 2000px)
    - Si le fichier est une image, création d'une miniature
    - Upload et Transfert du fichier
    - Enregistrement dans les tables de la base de données
    - Actualisation de la page

    J'arrive à intégrer le module dans ma page, à faire apparaître les éléments grâce aux classes, les styles évènementiels. Les paramètres de classes javascript, pareil : ça va. Mais j'ai du mal sur :
    • la transmission des variables (notamment le champ input - "légende" dans tes exemples - pour chaque fichier uploadé)
    • l'intégration dans la base de données (est-ce que je peux utiliser "mes" variables dans ton code puisque ma connexion à la bdd est déjà faîte ?)...
    • ... et à quel moment faire mes enregistrements dans la base de données
    • les outils de redimensionnement (sans recadrage) des photos avec la création de la miniature


    Ma question (s'il ne devait y en avoir qu'une) serait donc : est-ce qu'il y a les outils appropriés dans ton code pour faire les étapes de ma procédure ? Et si oui (je n'en doute pas) où puis-je les trouver et que puis-je gardé dans les fichiers d'exemples ?
    ...
    Oui, je sais, ça fait plus d'une question.

    Bon, j'arrive quand même à quelque chose :
    Nom : Sans titre.png
Affichages : 449
Taille : 24,8 Ko

    Au moins, le module est visuellement bien intégré dans mon site, je peux choisir mes fichiers, les infos s'affichent bien et le transfert/upload marche bien. Mais il me manque quelques étapes en cours de route...

    Je ne demande évidemment pas un code tout prêt, je souhaite vraiment comprendre plus en détail le fonctionnement de ton script à partir de cet exemple qui est plus proche de mes compétences.

    Moment constructif :
    D'ailleurs, petite remarque pour une amélioration : pour les gens comme moi d'un niveau intermédiaire, je trouve qu'il serait bon d'intégrer des exemples plus graduels que ce qu'ils sont actuellement. J'ai très bien compris les exemples de bases qui montrent "en gros" le principe de ton code, mais j'ai trouvé la marche un peu haute après, quand je suis allé dans les fichiers Crop, Crop_multiple, etc. Le gap était trop grand entre les premiers fichiers assez épurés, et les suivants aux nombreuses options.
    Par exemple, j'aurais aimé voir un fichier d'exemple pour le seul renommage de chaque fichier uploadé. L'exemple où j'ai trouvé cela était noyé dans les Crop et les redimensionnement d'image, je n'ai malheureusement pas retrouvé ce que je voulais.

    Merci beaucoup si tu arrives à m'aiguiller, je suis sûr que ce dont j'ai besoin est à portée de main, mais j'aurais besoin d'un petit coup de pouce.

    A bientôt je l'espère.

  5. #165
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Citation Envoyé par AK2745 Voir le message
    Bonjour Alain,

    Tout d'abord, bravo et merci pour cet outil d'une rigueur et d'une efficacité à toute épreuve !
    ...
    Petit problème pour moi, c'est que c'est trop rigoureux et efficace pour moi ...
    C'est rigoureux dans le sens où le code d'upload côté php est forcément dépendant de la construction du formulaire, mais bon c'est le même principe pour tout formulaire standard.

    Là où cela se complique un peu c'est pour ajouter des champs spécifiques à chaque fichier uploadé dans le cas d'upload multiples. Etant donné que les fichiers peuvent être stoppés avant l'upload (et donc ne pas être soumis dans le formulaire) et que par ailleurs chaque fichier possède un identifiant unique, j'ai choisi dans mes exemples d'identifier les champs spécifiques à chaque fichier, en concaténant le nom du champ à l'identifiant du fichier. C'est pour cela que tu peux voir dans le fichier "UploadAjaxABCI_Crop_multiple.php" les lignes javascript :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // Redéfinition des noms des champs spécifiques aux fichiers avec un identifiant unique.  On se sert de la propriété "cook_name" de l'objet spécifique au fichier. 
    	leg.attr('name', name_legende_C+''+data.cook_name);
    Le nom de l'input "légende" est redéfini avec "legende"+"data.cook_name. "data.cook_name" étant l'identifiant (nom) de l'éventuel cookie associé au fichier. Cet identifiant est toujours défini même si le cookie n'est pas envoyé (car pas toujours nécessaire), donc tu peux t'en servir dans tous les cas. Donc côté php pour récupérer ce champ "légende" spécifique à chaque fichier il suffira de faire comme indiqué dans le fichier "UploadAjaxABCI_Php_Load_Crop_multiple.php" :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    // Création de l'index du champ légende identique à celui créé en javascript
    $index_legende = 'legende'.$up->getParam("cook_name"); 
    // récupération de la valeur du champ "legende" s'il existe
    $legende = isset($_POST[$index_legende]) ? urldecode($_POST[$index_legende]) : null;
    Je récupère donc un champ nommé initialement "legende" dans le formulaire, concaténé ensuite avec javascript avec l'identifiant du fichier "cook_name". Cela permet de récupérer à coup sur le champ légende associé au fichier.

    Bien entendu en cas d'upload simple (non pas multiple) on aurait pas besoin de cet astuce et l'on pourrait faire directement (toujours à supposer que tu ajoute un champ input nommé "legende"):
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    $legende = isset($_POST["legende"]) ? urldecode($_POST["legende"]) : null;


    Concernant la connexion à ta bdd, elle n'est pas "déjà" faite car quand tu fais appel à une requête ajax tu fais appel à un nouveau fichier php, il faut donc refaire ta connexion. Tu peux aller dans le fichier "Php_Upload->Classes->ParamsDefautServeur.php" et renseigner les premières lignes de la fonction "getParamConnectBdd" avec tes valeurs :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $hostname = "localhost";
    $database = "alainbweb";
    $username = "root";
    $password = "";
    Ici se sont mes valeurs locales par défaut, à remplacer par les tiennes. Mais tu peux aussi inclure un fichier comme indiqué dans les commentaires. Ensuite tu pourras utiliser C_PDO::getC(); dans ton code php pour établir ta connexion. C'est une classe statique donc tu peux l'utiliser autant de fois que tu veux sans soucis (une seule connexion sera ouverte et utilisée dans tous les cas même si tu répète l'opération plusieurs fois).

    L'enregistrement en base de donnée est normalement faite après avoir utilisé la fonction "Transfert" qui s'assure que le fichier a été correctement transféré dans son répertoire définitif.

    Pour les redimensionnements sans recadrage voir le fichier "Php_Upload->UploadAjaxABCI_Php_Load_Redimensions.php".


    Citation Envoyé par AK2745 Voir le message
    D'ailleurs, petite remarque pour une amélioration : pour les gens comme moi d'un niveau intermédiaire, je trouve qu'il serait bon d'intégrer des exemples plus graduels que ce qu'ils sont actuellement. J'ai très bien compris les exemples de bases qui montrent "en gros" le principe de ton code, mais j'ai trouvé la marche un peu haute après, quand je suis allé dans les fichiers Crop, Crop_multiple, etc. Le gap était trop grand entre les premiers fichiers assez épurés, et les suivants aux nombreuses options.
    Par exemple, j'aurais aimé voir un fichier d'exemple pour le seul renommage de chaque fichier uploadé. L'exemple où j'ai trouvé cela était noyé dans les Crop et les redimensionnement d'image, je n'ai malheureusement pas retrouvé ce que je voulais.
    En fait le champ "légende" dans les exemple de crop n'est par prévu initialement dans le but de renommer les fichiers, mais d'apporter une information complémentaire pour chaque fichier uploadé. Mais bon tu peux aussi l'utiliser de cette manière par contre il faudra modifier le code php en conséquence.

  6. #166
    Futur Membre du Club
    Homme Profil pro
    Agent de développement (animateur MJC)
    Inscrit en
    Décembre 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Agent de développement (animateur MJC)
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Décembre 2017
    Messages : 6
    Points : 6
    Points
    6
    Par défaut Ça devient bon !
    Bonjour / bonsoir / bonne nuit Alain.

    Tout d'abord, merci pour ta réponse. J'ai suivi tes recommandations et explications, et j'ai creusé à partir de là plus en profondeur les fichiers d'exemples que tu as fournis avec ton partage. Après plusieurs heures, j'arrive à faire ce que je veux, c'est parfait !

    Je mettrai mon code un fois terminé avec quelques explications, pour voir si tout va bien, et si ça peut en aider d'autres.

    Il me reste encore quelques fonctionnalités à développer, mais je plus gros et laborieux pour moi est fait, je pense.

    Quelques questions toutefois pour ma suite, sur des points qui m'ont parus plus ardus :
    • Est-il possible de transmettre une variable $_GET avec le formulaire à la requête AJAX, ou bien doit-on faire passer la variable par un input[type=hidden] ?
    • Peux-tu ré-expliquer brièvement le fonctionnement du retour d'infos serveur : j'ai du mal avec les valeurs des variables/méthodes JS et PHP pour faire apparaître un message au bon moment ?


    En te remerciant par avance pour tes réponses.

    Tu mériteras grandement une place dans les crédits de mon site ;-) !

    A bientôt.

  7. #167
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Citation Envoyé par AK2745 Voir le message
    [*]Est-il possible de transmettre une variable $_GET avec le formulaire à la requête AJAX, ou bien doit-on faire passer la variable par un input[type=hidden] ?
    Mieux vaut ajouter un input de type hidden dans ton formulaire, car il sera transmis automatiquement sans que tu aies à modifier quoi que ce soit dans le code javascript, ce qui ne serait pas le cas avec une variable $_GET puisqu'il te faudrait modifier l'url du fichier de destination ajax pour y ajouter ta variable.
    Donc tu ajoutes ton input dans ton formulaire, en dehors du bloc html ayant la classe "UpAbci_infosFile" si c'est un input non spécifique à chaque fichier, et en php il te suffit de récupérer cette valeur comme indiqué dans le mode d'emploi, soit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ma_variable = isset($_POST['ma_variable']) ? urldecode($_POST['ma_variable']) : null;


    Citation Envoyé par AK2745 Voir le message
    [*]Peux-tu ré-expliquer brièvement le fonctionnement du retour d'infos serveur : j'ai du mal avec les valeurs des variables/méthodes JS et PHP pour faire apparaître un message au bon moment ?
    Tu dispose en option de fonctions javascript événementielles comme
    config.func_FileEndEach = function(objet, info_serveur, mixte_serveur){};,
    ou encore :
    config.func_FormEnd = function(tableau, info_serveur, mixte_serveur){};,
    qui sont déclenchées (si tu les utilise) à la fin du traitement de chaque fichier pour la première et à la fin du traitement du formulaire pour la seconde.

    Chacune de ces fonctions retourne des informations dans trois paramètres qui sont respectivement :

    1er paramètre : un objet contenant les informations du fichier pour config.func_FileEndEach ou un tableau d'objets contenant les informations de chaque fichier pour config.func_FileEndEach. La liste des informations contenues dans chaque objet est détaillée ici.

    Les deuxièmes et troisième paramètres sont utilisés pour récupérer des informations serveur complémentaires.

    2ème paramètre : info_serveur contient la réponse éventuelle du serveur transmise en Php avec la méthode addInfosServer() et qui s'affichera automatiquement dans l'élément html (si défini) ayant la classe "UpAbci_infosServer". Peut contenir du texte ou du html.

    3ème paramètre : mixte_serveur contient la réponse éventuelle du serveur transmise en Php avec la méthode addMixteServer(). Cette variable n'est pas affichée directement dans le html. Elle peut donc contenir du texte, du html ou encore un tableau que tu exploiteras comme tu veux.

    Bon ça c'est dans le mode d'emploi, qu'est-ce que tu ne comprend pas ?

    Il y a deux paramètres disponibles pour les infos complémentaires car ils ne fonctionnent pas de la même manière.
    info_serveur contient une information qui sera automatiquement affichée dans ton html si tu as défini dans ton formulaire un bloc html ayant la classe "UpAbci_infosServer". Tu peux récupérer évenutuellement cette valeur en javascript mais même sans l'utilisation de fonction javascript évènementielle cette valeur sera affichée automatiquement dans ce bloc html si ce bloc existe.

    Il y a une limitation à ce paramètre : il doit contenir du texte ou du html puisque son contenu est destiné à être affiché directement dans le html.

    C'est pourquoi un troisième paramètre complémentaire mixte_serveur est disponible qui peut contenir n'importe quoi, par exemple un tableau php qui sera exploité ensuite avec javascript. Il suffit avec php d'utiliser la méthode addMixteServer() pour définir ce paramètre.
    Par exemple en php :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    //...
    $toto = 1;
    $titi = 2;
    $mixte_serveur = array('toto'=>$toto,'titi'=>$titi);
    $up->addMixteServer($mixte_serveur);
    //...
    $up->exitReponseAjax();

    En javascript :
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    up.config.func_FileEndEach = function(objet, info_serveur, mixte_serveur){
        if(mixte_serveur != undefined)
        {
             console.log(mixte_serveur.toto+' '+mixte_serveur.titi)};
             // devrait afficher "1 2"  
        }
    }

    Donc côté php si tu utilise addInfosServer(), tu n'es pas obligé d'utiliser les fonctions javascript événementielles pour exploiter le retour puisque son contenu est automatiquement transmis dans le bloc html ayant la classe "UpAbci_infosServer".

    Par contre si tu utilise la méthode php addMixteServer(), tu dois utiliser une fonction javascript événementielle pour récupérer le paramètre mixte_serveur et l'utiliser comme bon te semble.

    Dans l'absolu j'aurais pu ne proposer que le paramètre mixte_serveur dans le retour de ces fonctions événementielles puisque c'est le plus polyvalent (peut renvoyer tout type de contenu y compris des tableaux). Cela dit, comme on dispose de la méthode php addInfosServer() pour envoyer une information directement dans le htm sans passer obligatoirement par l'utilisation de fonctions javascript événementielles, ce qui rend le code plus simple et plus abordable pour les débutants, il est logique que dès lors qu'on utilise les fonctions événementielles, on puisse également avoir accès à l'information info_serveur dans ces fonctions, même si pratiquement on l'utilisera peu souvent puisque la classe javascript l'affichera automatiquement par défaut dans le bloc html ayant la classe "UpAbci_infosServer" (si défini).

    C'est clair ?

  8. #168
    Futur Membre du Club
    Homme Profil pro
    Agent de développement (animateur MJC)
    Inscrit en
    Décembre 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Agent de développement (animateur MJC)
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Décembre 2017
    Messages : 6
    Points : 6
    Points
    6
    Par défaut Ça s'affiche
    Bonjour Alain,

    C'est sans doute très clair, mais comme je l'ai dis plus haut, je ne suis pas très familier de la POO et du JS, donc l'AJAX...

    Ta doc est très complète et les fichiers exemples sont bien construits, mais comme je suis limite point de vue compétence, j'avais du mal à refaire le cheminement du script (à quel moment se déclenche quoi, et pour quoi faire ?) tout simplement parce que je n'ai pas tous les concepts sur le bout des doigts. Mais avec ton dernier commentaire, j'ai eu un regroupement des ressources et de la doc sur ce sujet, ce qui m'a permis de trouver l'essentiel de ce que je cherchais. Je dirais pas que j'ai tout saisis, mais au moins j'ai réussi à faire apparaître ce que je voulais grâce à la méthode addInfosServer (comme tu dis elle est bien pour les débutant).

    Merci !

  9. #169
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Citation Envoyé par AK2745 Voir le message
    j'ai réussi à faire apparaître ce que je voulais grâce à la méthode addInfosServer (comme tu dis elle est bien pour les débutant).
    Merci !
    Ah ok, tu me parlais précédemment de "valeurs des variables/méthodes JS et PHP" c'est pour cela que je t'ai parlé de ces fonctions événementielles, mais si tu peux t'en passer c'est plus facile surtout si tu ne maîtrise pas bien javascript. Et donc effectivement la méthode addInfosServer() côté php est conçue pour cela, avec la limite déjà citée (ne peut renvoyer que du texte ou du html) mais cela permet néanmoins de faire beaucoup de choses.

    En fait on peut déjà aller très loin au niveau de la personnalisation du script sans utilisation des fonctions javascript événementielles. Et pour cause ce module d'upload a été développé initialement dans ce but et éviter d'avoir à programmer du javascript. C'est donc seulement dans un second temps que je les ai implantées. Cela permet d'aller plus loin et elles sont indispensables par exemple pour les recadrages d'image côté client (crop), ou encore pour identifier d'éventuels inputs supplémentaires spécifiques à chaque fichier dans le cas d'upload multiple, comme j'en ai parlé dans mon premier message.

    Donc encore une fois, pour ceux qui ne maitrisent pas bien javascript, autant n'utiliser les fonctions javascript événementielles que quand elles sont indispensables, il y a déjà beaucoup de ressources disponibles sans cela. Au passage, le formulaire numéro cinq contenu dans le fichier "UploadAjaxABCI.php" donne un exemple d'exploitation d'un retour serveur personnalisé qui affiche le nombre total de fichiers correctement uploadés dans l'élément html ayant la classe "UpAbci_infosServer" et sans utilisation de fonctions javascript événementielles

    Enfin bon, quand j'aurai le temps, je ferai un exemple particulier pour les éventuels inputs additionnels spécifiques à chaque fichier, car comme tu le disais dans ton premier message, les deux lignes de codes nécessaires sont un peu noyées dans l'exemple de crop qui est lui-même plus conséquent. Et peut être aussi un paragraphe spécial pour mieux expliquer le fonctionnement des retours serveur.

  10. #170
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Bonjour,

    Correction concernant l'utilisation de la fonction urldecode() dans les scripts php d'upload (répertoire Php_Upload/). C'est fonction n'est pas utile, et son emploi a comme inconvénient de ne pas pouvoir récupérer les caractères "+" transmis dans le formulaire (qui sont remplacés par un espace vide).

    Ce problème n'affecte pas le système d'upload lui-même (ce qui explique qu'i n'a pas été détecté plus tôt), il concerne uniquement les champs text que vous auriez pu ajouter dans le formulaire. Il suffit donc de récupérer vos variables de manière tout à fait classique dans la super globale $_POST.
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    $ma_variable = isset($_POST['ma_variable']) ? $_POST['ma_variable'] : null;

    Je posterai d'ici quelques temps une nouvelle version avec cette correction et quelques améliorations côté javascript et php.

  11. #171
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 16
    Points : 22
    Points
    22
    Par défaut upload automatique
    Hello à vous

    J'ai cherché dans la doc mais je n'ai pas trouvé.
    Est-il possible de faire un submit automatique après la sélection des fichiers à envoyer, sans devoir cliquer sur le bouton donc ?

    J'ai essayé :

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    onchange="document.getElementById('form_file').submit()"

    Sans le type file, mais ça ne donne pas de résultat.

    Merci à vous.

  12. #172
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Salut,

    Il suffit d'utiliser la fonction javascript événementielle "config.func_FileSelectAll" dans la configuration javascript de ton formulaire.

    A supposer que l'id de ton formulaire se nomme "myform" :
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    var up = new UploadAjaxABCI(...);
    //...
    up.config.func_FileSelectAll = function(event,tableau){
    	$('#myform').submit();
    }
    //...
     
    $(function(){up.Start()});

    Voir la note dans mon message suivant.

  13. #173
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Bonjour,

    Je termine une nouvelle version. En complément de la correction de mon message précédent (ne pas utiliser urldecode côté serveur pour récupérer la valeur des champs que vous avez ajoutés dans le formulaire), j'ai trouvé un second problème potentiel toujours en php mais côté formulaire pour définir la variable $upload_max_filesize.

    Dans les fichiers d'exemples de formulaire, remplacer la ligne :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    $upload_max_filesize = $up->returnOctets(min(ini_get('upload_max_filesize'),ini_get('post_max_size')));
    par
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    $upload_max_filesize = min($up->returnOctets(ini_get('upload_max_filesize')), $up->returnOctets(ini_get('post_max_size')));


    Voilà, c'est les deux seuls problèmes qui seront corrigés dans la prochaine version.

    La prochaine version 7 ne sera pas compatible avec les précédentes. L'essentiel ayant déjà été fait, la version 7 évolue pour faciliter au maximum la construction des formulaires et des fonctionnalités sur mesure, aussi certaines propriétés et méthodes des classes javascript et php ont été renommées.

    Je ferai un récapitulatif des problèmes trouvés dans la version précédente - qui se limitent actuellement aux deux précédemment énoncés - pour corriger le code des anciennes versions. Mais bon, ce ne sont que des problèmes très secondaires, malencontreusement inclus dans les exemples d'utilisation, mais sans rapport direct avec les classes d'upload javascript et php, pour dire qu'il n'y a pas lieu de modifier votre code existant s'il vous donne satisfaction.

  14. #174
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 16
    Points : 22
    Points
    22
    Par défaut
    Merci beaucoup, ça fonctionne parfaitement bien

    ça fait quelques heures que je cherche encore une action de reload de ma page à la fin des upload, je vois bien:
    ReloadPage()
    Recharge la page en php. A utiliser après l'upload et avant l'affichage des résultats pour éviter un nouvel upload en cas de rafraîchissement de la page. Si vous utilisez un routeur il est possible que vous soyez amené à modifier cette fonction dans la classe "UploadFormABCIServeur.php".

    Mais je ne comprend pas, encore comment faire !
    Une aide encore une fois serait la bien venue

    encore merci


    Citation Envoyé par ABCIWEB Voir le message
    Salut,

    Il suffit d'utiliser la fonction javascript événementielle "config.func_FileSelectAll" dans la configuration javascript de ton formulaire.

    A supposer que l'id de ton formulaire se nomme "myform" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    var up = new UploadAjaxABCI(...);
    //...
    up.config.func_FileSelectAll = function(event,tableau){
    	$('#myform').submit();
    }
    //...
     
    $(function(){up.Start()});
    Voir la note dans mon message suivant.

  15. #175
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Que veux tu faire exactement ? Quel rapport avec ce que tu avais demandé précédemment ?
    ReloadPage() est une méthode de la classe "UploadFormABCIServeur.php" utilisée uniquement avec les navigateurs obsolètes, cela n'a rien à voir avec la classe "UploadAjaxABCIServeur.php" qui traite les formulaires pour les navigateurs "modernes" >= IE 10. Dans quel but veux-tu recharger ta page ?

  16. #176
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 16
    Points : 22
    Points
    22
    Par défaut
    ah ba effectivement rien à voir alors, et pourtant:
    ReloadPage()
    Recharge la page en php...
    fait ce que je voudrais dans sa description

    j'ai inclus ma page d'upload dans une autre page, je veux juste recharger la page à la fin de l'upload.
    Merci

  17. #177
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Même chose que dans mon message précédent, utilises les fonctions événementielles, elles sont conçues pour cela. La fonction config.func_FormEnd s'exécute (si tu la définie) à la fin du traitement du formulaire. Tu peux intégrer le code javascript que tu veux à l'intérieur. Dans ton cas, si tu souhaites faire un reload, il te suffit d'écrire, toujours dans la configuration javascript de ton formulaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    //....
    up.config.func_FormEnd = function ()
    {
         document.location.reload(true);
    }
    //...
    C'est quand même assez simple, non ?

    Pour être plus précis (voir la doc), cette fonction retourne trois objets : config.func_FormEnd = function (tableau, info_server, mixte_server), mais tu n'es pas obligé de les écrire si tu n'en as pas besoin (c'est comme pour toutes les fonctions javascript).

  18. #178
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Bonjour,

    La version 7.0 est disponible

    Elle corrige l'emploi de la fonction urldecode() côté php ainsi que la ligne qui définit $upload_max_filesize dans les formulaires d'exemples, comme indiqué dans ce message. Le plugin jQuery fileEXIF a également été remplacé, voir la fin du paragraphe suivant.

    Comme annoncé précédemment, cette version n'est pas compatible avec les précédentes car certaines propriétés et méthodes ont été renommées pour faciliter la création de code sur mesure. De plus, certaines classes php annexes ont désormais une gestion des exceptions plus classique et lisible.

    Mise à jour de la classe javascript
    - Les champs de saisie éventuellement ajoutés dans les informations spécifiques à chaque fichiers sont désormais transmis uniquement dans les requêtes envoyant le fichier correspondant, ce qui permet de les récupérer sans ambiguïté côté serveur même en cas d'upload multiple. Une classe html prédéfinie UpAbci_inputInfosFileUnic complète ce dispositif afin de renommer certains champs, typiquement les boutons de type radio qui ne permettent qu'une sélection dans tout le formulaire pour un champ de même nom (par nature incompatible avec un upload multiple).

    - Une option config.inputFormAttrOnSubmit a été ajoutée pour permettre d'attribuer automatiquement à la soumission du formulaire, l'attribut "disabled" ou "required" aux champs de saisies éventuellement ajoutés dans le bloc d'information spécifique aux fichiers, afin d'indiquer à l'utilisateur que leur valeur ne peut pas être modifiée durant l'upload.

    - Le style événementiel data-upabcicss-upload-end est appliqué également avant la soumission du formulaire si tous les fichiers on été arrêtés avant l'envoi du formulaire. Auparavant ce style n'était appliqué qu'au retour de la requête ajax, après l'envoi du formulaire. Cela permet d'étendre ses possibilités et de mieux le différencier du style data-upabcicss-form-end qui lui est appliqué au retour de la requête ajax avec ou sans fichiers joints.

    . La fonction de prévisualisation des images sait désormais réorienter des images mal orientées en fonction de leurs informations EXIF (à condition qu'elles soient bien renseignées). Cette fonctionnalité est compatible avec les exemples de Crop (recadrage) et redimensionnements.

    - Une option de configuration config.imgPreviewUseFileReader est également disponible pour permettre d'utiliser l'objet "FileReader" plutôt que "createObjectURL" afin de compenser le bug 1434496 de firefox pour la prévisualisation des images. Des exemples de code montrent comment utiliser cette option uniquement pour Firefox (le temps que l'équipe Mozilla corrige ce bug) car "FileReader" est bien plus gourmand en ressources que "createObjectURL".

    - Une classe annexe DrawCanvasABCI est fournie pour créer un système de notation graphique des fichiers (coeurs ou étoiles, possibilité d'ajouter d'autres dessins) facilement intégrable dans la configuration javascript du formulaire, exemple en démonstration dans le fichier UploadAjaxABCI_Champs_Sup_Notation.php.

    Correction code annexe : je donnais dans le tutoriel, un exemple d'utilisation des fonctions javascript événementielles avec le plugin jQuery file-exif pour afficher les informations Exif des appareils photo numériques. Or il s'avère que ce plugin n'est pas compatible avec IE10. Mon exemple utilise donc maintenant cette librairie.

    Mise à jour du code Php
    - 2 corrections énoncées au début de ce messge.

    - Une nouvelle méthode getInputInfosFileUnic('index') permet de récupérer la valeur des champs auxquels on a attribué la classe UpAbci_inputInfosFileUnic.

    - Une classe CorrectionExifJpg.php est fournie pour réorienter des images mal orientées en fonction de leurs informations EXIF (à condition qu'elles soient bien renseignées). Cette fonctionnalité est compatible avec les exemples de Crop (recadrage) et redimensionnements. C'est le complément indispensable de la fonctionnalité équivalente en javascript. Des exemples sont fournis dans les scripts de redimensionnements et de recadrage.

    Modification : les classes annexes "C_PDO", "CropRedim", "RedimImage" et "CorrectionExifJpg" doivent être utilisées dans un bloc try/catch. Cela permet un code plus classique et lisible pour la gestion des exceptions.

    Fichiers d'exemples
    - Le fichier UploadAjaxABCI_Champs_Sup_Notation.php a été ajouté. Il regroupe les possibilités d'échange de données entre client et serveur et des exemples d'utilisation des fonctions javascript événementielles.

    - Tous les fichiers d'exemples ont été revus.


    Mode d'emploi
    Le mode d'emploi a été mis à jour et des paragraphes ont été ajoutés pour répondre aux principales questions qui ont été posées depuis le début de ce topic.

    => Pensez à utiliser les boutons + dans le menu du mode d'emploi qui permettent de maintenir les rubriques ouvertes pour avoir l'équivalent d'une FAQ.

    Tuto mis à jour.


    Voilà

  19. #179
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2018
    Messages : 34
    Points : 12
    Points
    12
    Par défaut
    Bonjour,

    Tout d'abord un grand merci pour cet outil très performant ! J'ai cherché un tel code pendant plusieurs temps avant de trouver celui-ci qui me convient parfaitement !

    J'ai néanmoins un petit problème (ou une petite question). Le module fonctionne très bien avec mes adaptations mais il n'est néanmoins pas optimal. Je m'explique ...
    Je suis parti de l'exemple UploadAjaxABCI_Redimensions.php que j'ai pas mal adapté

    Mon formulaire se présente comme suit :

    1) On crée un nouvel album photo (on indique le nom du coup dans l'input)
    OU on choisi un album existant pour y mettre les photos (on select le bon album)

    2) On sélectionne nos photos

    Mon fichier de destination Ajax : Php_Upload/UploadAjaxABCI_Upload_Redimensions.php

    J'y ai inséré mes conditions PHP (un bête if else) en fonction du premier choix (créer ou reprendre un album existant) au début du fichier pour pouvoir indiquer dans le code de base le dossier de destination.

    Cela fonctionne parfaitement mais vu que le fichier semble être appelé à chaque fichier, mes conditions PHP sont également appelées à chaque fichier alors qu'une seule fois suffirait. En plus je log toutes les modifications (j'ai donc autant de fois le même log que j'ai de fichiers).

    Ma question est donc la suivante : Que puis-je faire pour optimiser ce code ? Où puis-je placer mes conditions de base ?

    D'avance merci pour votre aide !

  20. #180
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Citation Envoyé par D333x Voir le message
    J'y ai inséré mes conditions PHP (un bête if else) en fonction du premier choix (créer ou reprendre un album existant) au début du fichier pour pouvoir indiquer dans le code de base le dossier de destination.

    Cela fonctionne parfaitement mais vu que le fichier semble être appelé à chaque fichier, mes conditions PHP sont également appelées à chaque fichier alors qu'une seule fois suffirait. En plus je log toutes les modifications (j'ai donc autant de fois le même log que j'ai de fichiers).

    Ma question est donc la suivante : Que puis-je faire pour optimiser ce code ? Où puis-je placer mes conditions de base ?

    D'avance merci pour votre aide !
    Le fichier php d'upload est non seulement appelé pour chaque fichier, mais peut être aussi appelé plusieurs fois pour le même fichier si la taille du fichier dépasse la valeur de la variable php $UpAbci_fragmentSize définie dans le script du formulaire.

    Il y a de multiples possibilités pour optimiser ton script s'il en a besoin, mais pour te répondre au mieux il faudrait que tu me montre ton script php d'upload (UploadAjaxABCI_Redimensions.php) en m'indiquant les endroits que tu souhaite optimiser. Cela m'évitera de nombreuses questions et de répondre par tâtonnement. Montre-moi ton code et je pourrai te répondre à partir de mercredi prochain (dans trois jours, car je n'aurai probablement pas le temps avant)

+ Répondre à la discussion
Cette discussion est résolue.
Page 9 sur 15 PremièrePremière ... 5678910111213 ... DernièreDernière

Discussions similaires

  1. Upload de fichiers par fragments (chunk) - Erreur d'ouverture du fichier temporaire
    Par Kakolio dans le forum Bibliothèques & Frameworks
    Réponses: 5
    Dernier message: 10/07/2015, 18h27
  2. [SP-2007] Upload de gros fichiers par programme
    Par bigboomshakala dans le forum SharePoint
    Réponses: 10
    Dernier message: 31/03/2010, 09h55
  3. [Upload] Upload de GROS fichiers en php
    Par osscour dans le forum Langage
    Réponses: 21
    Dernier message: 26/05/2006, 14h13
  4. [Upload] Problème upload de gros fichiers avec Firefox
    Par the rootsm@n dans le forum Langage
    Réponses: 12
    Dernier message: 19/02/2006, 20h43
  5. [Upload] Upload de gros fichiers
    Par Rémiz dans le forum Langage
    Réponses: 8
    Dernier message: 07/01/2006, 11h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo