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

Langage PHP Discussion :

Compresser le poids d'une image


Sujet :

Langage PHP

  1. #1
    Membre habitué
    Homme Profil pro
    sans emploi
    Inscrit en
    Février 2014
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2014
    Messages : 365
    Points : 131
    Points
    131
    Par défaut Compresser le poids d'une image
    Bonjour,

    J'ai un formulaire qui me permet de télécharger des images à la racine de mon site web ...

    Existe il une fonction php permettant de compresser le poids de l'image (si celle ci est > 500 ko par exemple)?
    Fonction ... ou bibliothèque ...

    Cordialement

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Tu parles d'une compression comme changer la qualité JPEG ou d'un ZIP ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre habitué
    Homme Profil pro
    sans emploi
    Inscrit en
    Février 2014
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2014
    Messages : 365
    Points : 131
    Points
    131
    Par défaut
    compression dans le sens ou on passerait par exemple de 15000 ko à 300 ko (donc en terme de poids)

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Certes mais avec perte de qualité, réduction des dimensions ou une compression comme zip ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Membre habitué
    Homme Profil pro
    sans emploi
    Inscrit en
    Février 2014
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2014
    Messages : 365
    Points : 131
    Points
    131
    Par défaut
    avec perte de qualité mais pas forcément réduction des dimensions

    Peut on réduire la taille d'une image en ko sans toucher aux dimensions (hauteur, largeur)?
    Par exemple jusque la j'utilisais le logiciel Caesium pour réaliser cette opération: j avais une perte de poids (ko) sans modification des dimensions (hauteur, largeur)

  6. #6
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 382
    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 382
    Points : 10 410
    Points
    10 410
    Par défaut
    Oui tu peux utiliser imagecreatefromjpeg() and co et imagejpeg and co. Pratiquement :

    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
    // nécessite de définir préalablement $rep_Src, $img_Src, $rep_Dst, $img_Dst et $extension_Src
    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(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)) 
    {
    	switch ($extension_Src) 
    	{ 
    		case 'jpg':
    		case 'jpeg': $image = imagejpeg ($Ress_Src, $rep_Dst.$img_Dst, 90); break;
    		case 'png': $image = imagepng ($Ress_Src, $rep_Dst.$img_Dst,1); break;
    		case "gif" : $image = imagegif($Ress_Src, $rep_Dst.$img_Dst); break;
     
    		default : $image = false;
    	}
    }
    Sinon si tu veux le faire lors de l'upload de fichiers vers le serveur tu peux te servir de cette classe d'upload. Elle supporte l'upload multiple, surpasse les limitations serveur post_max_size, upload_max_filesize et max_file_upload et parmi la douzaine d'exemples fonctionnels, un est consacré au redimensionnement d'images. Il suffit de fournir des paramètres = 0 ou indéfinis pour la largeur max et pour la hauteur max et dans ce cas l'image n'est pas redimensionnée mais simplement optimisée pour le web (= compressée) avec un script similaire à celui ci-dessus.

  7. #7
    Membre habitué
    Homme Profil pro
    sans emploi
    Inscrit en
    Février 2014
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2014
    Messages : 365
    Points : 131
    Points
    131
    Par défaut
    Merci ACIWEB c 'est un formidable outils

    Je voudrais épurer les fichiers qui ne servent à rien pour l'adapter à mes besoins ...

    Ce qui m'intéresse c'est UploadAjaxABCI_Redimensions.php renomé index.php

    Donc a la racine du site j'ai:
    -le fichier index.php:
    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
    <?php
    // UPLOAD D IMAGES Upload-Ajax-ABCI
    // --------------------------------
    // Utilise le fichier "UploadAjaxABCI_Php_Load_Redimensions_optimise.php" comme destination Ajax
     
    header('Content-type: text/html; charset=UTF-8');
    $UpAbci_fragmentSize = 4194304;// taille maximale des fragments (doit être inférieur ou égal à la configuration 'upload_max_filesize' du serveur). Les fichiers inférieurs à cette taille n'auront pas de sauvegarde temporaire.
    $UpAbci_uniqidForm = hash("sha256",uniqid(rand(), true));
     
    // Jeton de formulaire (token);
    $_SESSION['UploadAjaxABCI'][$UpAbci_uniqidForm]['token'] = 1;
    ?>
     
    <!DOCTYPE html> <!--on declare au validator le langage utilisé: html5-->
     
    <html lang="fr">
     
    <body>
     
    <!-- UPLOAD D IMAGES Upload-Ajax-ABCI
     -------------------------------- -->	
    <div>
    	<form id="form_redim" action="#" method="post">
    		<fieldset>
    			 <input type="file" name="upload_simple" multiple="multiple" />
    			 <input type="hidden" value="<?=$UpAbci_fragmentSize?>" name="UpAbci_fragmentSize" />
    			 <input type="hidden" value="<?=$UpAbci_uniqidForm?>" name="UpAbci_uniqidForm" />
    			 <input type="submit" value="Envoyer"/>
     
    			 <!-- Bloc conteneur du retour d'informations -->
    			 <div id="reponse_upload">
    				<!--information du fichier que l'on affiche uniquement si un fichier est sélectionné, pour éviter la barre de progression graphique vide si soumission du formulaire sans fichier-->
    				 <div class="UpAbci_infosFile" style="display:none;margin-top:1em;clear:both" data-upabcicss-select-file="display:block;">
    					 <hr>
     
    					<span class="UpAbci_stop" style="color:red;cursor:pointer;font-size:0.8em;" data-upabcicss-result="display:none">stop </span>
     
    					<span class="UpAbci_name"></span><!-- nom du fichier -->
     
    					<progress class="UpAbci_progressionG"></progress> <!-- progression graphique -->
    					<span class="UpAbci_status" data-upabcicss-result-ok="color:green;font-weight:bold">en attente</span><!-- status (important sinon pas de retour d'information en cas d'erreur) -->
    					<span class="UpAbci_imgPreview" style="float:right"></span><!-- vignettes si le poids total ne dépasse pas la config javascript définie plus bas à 100Mo  -->
     
    					<p style="display:none;" data-upabcicss-result-partial="display:block">- sauvegardé : <span class="UpAbci_backup">0 Mo</span></p><!-- S'affichera si une sauvegarde existe en cas d'arrêr ou d'erreur -->
     
    				 </div>
    			</div>
    		</fieldset>
    	</form>
    </div>
     
     
    <!-- UPLOAD D IMAGES Upload-Ajax-ABCI
     -------------------------------- -->
     
    <script src="jquery.js"></script>
    <script src="UploadAjaxABCI.js"></script>
     
    <script type="text/javascript">
    // Initialisation de la classe javascript (identifiant formulaire, destination ajax, identifiant réponse)
     
    var destination_ajax = 'UploadAjaxABCI_Php_Load_Redimensions_optimise.php';
    // Utilisez la destination ci-dessous pour comparer avec une solution standard beaucoup plus lente
    //destination_ajax = 'UploadAjaxABCI_Php_Load_Redimensions.php';
     
    var up = new UploadAjaxABCI('#form_redim',destination_ajax,'#reponse_upload');
     
    // Extensions autorisées
    up.config.filesExtensions = ['jpg','jpeg','png','gif'];
     
    // S'affichera si le redimensionnement et l'upload sont ok.
    up.info.status.ok = "Upload et redimensionnements OK";
     
    // Message d'erreur si problème serveur. Sera complété par le message renvoyé par le serveur pour plus de précision.
    up.info.status.errorServer = "Echec du traitement. ";
     
    // les aperçus demandent pas mal de ressource, vous devriez baisser cette valeur ou supprimer la prévisualisation pour les portables.
    up.config.imgPreviewMaxSizeTotal = 100; // en Mo poids total maximum de toutes les photos. Au delà les vignettes ne seront pas affichées.
     
    up.config.imgPreviewMaxWidth = 100; // en pixels, largeur maximale de l'aperçu
    up.config.imgPreviewMaxHeight = 100;// en pixels, hauteur maximale de l'aperçu
     
    // Démarrage de la fonction, DOM chargé
    $(function(){up.Start()});
    </script>
     
    </body>
    </html>
    -le dossier Destination_Upload1
    -le dossier Upload_Temp
    -le fichier UploadAjaxABCI_Php_Load_Redimensions_optimise.php:
    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
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    <?php
    /*
    require 'UploadAjaxABCIServeur.php' et 'func_RedimImage.php';
    
    (Gardez bien à l'esprit que ce script sera appelé plusieurs fois pour le traitement du même post, excepté en cas d'upload simple si la taille du fichier est inférieure à la taille d'un fragment ou si aucun fichier n'est joint)
    
    // Exemple de script php d'upload avec redimensionnement d'images. Voir "UploadAjaxABCI_Php_Load_Redimensions.php" pour d'autres informations.
    
    /* Ce script utilise la même fonction de redimensionnement que le script "UploadAjaxABCI_Php_Load_Redimensions.php".
    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 de qualité 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_destination1 = '../Destination_Upload1/';
    $dossier_temporaire = '../Upload_Temp/';
    /*------------------------------------------------------*/
     
    session_start();
     
    header('Content-type: text/html; charset=UTF-8');
     
    require 'UploadAjaxABCIServeur.php';
     
    $up = new UploadAjaxABCIServeur($dossier_destination1, $dossier_temporaire);
     
    // Décommenter la ligne ci-dessous en phase de développement pour faire afficher les erreurs php dans le formulaire.
    /*
    $up->setModeDebug ();
    */
     
    $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->cathErrorServeur($tab_erreurs);
     
    $uniqid_form = $up->getParam("uniqid_form");
     
    if(!(isset($uniqid_form,$_SESSION['UploadAjaxABCI'][$uniqid_form]['token']))) $up->exitStatusErreur("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())
    {
    	$filesExtensions = array('jpg','jpeg','png','gif');
     
    	$nom_fichier_nettoye = $up->getCleanFileName();
     
    	$verif_extension = $up->VerifExtensions($nom_fichier_nettoye,$filesExtensions);
    	if($verif_extension == false) 
    	{
    		$up->exitStatusErreur('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->getTempAdressFileComplete();
    	if($fichier_complet != false)
    	{
    		require 'func_RedimImage.php';
     
     
    		/*Si plusieurs redimensionnements on utilise les troisième et quatrième paramètre de la fonction "func_RedimImage()" 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 = func_RedimImage($L, $H, $dossier_dest, $nom_fichier, $dirname, $basename, $extension_fichier);
     
    			if(!$redim) 
    			{			
    				$up->exitStatusErreur("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->exitStatusErreur("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->getRelativeAddress().$dossier_destination1;
     
     
    		// Si l'on souhaite garder l'image originale on fait une copie vers la destination
    		if (!copy($fichier_complet, $dossier_dest_serveur.$non_fichier.'.'.$extension_fichier)) 
    		{
        		$up->exitStatusErreur("Erreur dans la copie du fichier original.");
    		}
     
    		/* 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;
     
    		// Redimensionnements 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() transfère le fichier temporaire - qui dans cet exemple contient le plus grand redimensionnement - vers son emplacement définitif (retourne true si ok). L'utilisation de cette fonction est indispensable pour terminer l'upload (supprime le cookie et envoie les informations nécessaires au script ajax pour terminer la requête).  
    		$transfert = $up->Transfert($destination_fichier);
     
    		// On défini le chmod (si besoin)
    		if($transfert && !@chmod($destination_fichier,0604))
    		{
    			$up->exitStatusErreur("Echec de la configuration des droits d'accès du fichier");
    		}
    	}
    }
     
     
    // Voir le fichier "UploadAjaxABCI_Php_Load.php" pour des possibilités supplémentaires...
     
     
    $up->exitReponseAjax();
    ?>
    -le fichier UploadAjaxABCIServeur.php:
    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
    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
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    392
    393
    394
    395
    396
    397
    398
    399
    400
    401
    402
    403
    404
    405
    406
    407
    408
    409
    410
    411
    412
    413
    414
    415
    416
    417
    418
    419
    420
    421
    422
    423
    424
    425
    426
    427
    428
    429
    430
    431
    432
    433
    434
    435
    436
    437
    438
    439
    440
    441
    442
    443
    444
    445
    446
    447
    448
    449
    450
    451
    452
    453
    454
    455
    456
    457
    458
    459
    460
    461
    462
    463
    464
    465
    466
    467
    468
    469
    470
    471
    472
    473
    474
    475
    476
    477
    478
    479
    480
    481
    482
    483
    484
    485
    486
    487
    488
    489
    490
    491
    492
    493
    494
    495
    496
    497
    498
    499
    500
    501
    502
    503
    504
    505
    506
    507
    508
    509
    510
    511
    512
    513
    514
    515
    516
    517
    518
    519
    520
    521
    522
    523
    524
    525
    526
    527
    528
    529
    530
    531
    532
    533
    534
    535
    536
    537
    538
    539
    540
    541
    542
    543
    544
    545
    546
    547
    548
    549
    550
    551
    552
    553
    554
    555
    556
    557
    558
    559
    560
    561
    562
    563
    564
    565
    566
    567
    568
    569
    570
    571
    572
    573
    574
    575
    576
    577
    578
    579
    580
    581
    582
    583
    584
    585
    586
    587
    588
    589
    590
    591
    592
    593
    594
    595
    596
    597
    598
    599
    600
    601
    602
    603
    604
    605
    606
    607
    608
    609
    610
    611
    612
    613
    614
    615
    616
    617
    618
    619
    620
    621
    622
    623
    624
    625
    626
    627
    628
    629
    630
    631
    632
    633
    634
    635
    636
    637
    638
    639
    640
    641
    642
    643
    644
    645
    646
    647
    648
    649
    650
    651
    652
    653
    654
    655
    656
    657
    658
    659
    660
    661
    662
    663
    664
    665
    666
    667
    668
    669
    670
    671
    672
    673
    674
    675
    676
    677
    678
    679
    680
    681
    682
    683
    684
    685
    686
    687
    688
    689
    690
    691
    692
    693
    694
    695
    696
    697
    698
    699
    700
    701
    702
    703
    704
    705
    706
    707
    708
    709
    710
    711
    712
    713
    714
    715
    716
    717
    718
    719
    720
    721
    722
    723
    724
    725
    726
    727
    728
    729
    730
    731
    732
    733
    734
    735
    736
    737
    738
    739
    740
    741
    742
    743
    744
    745
    746
    747
    748
    749
    750
    751
    752
    753
    754
    755
    756
    757
    758
    759
    760
    761
    762
    763
    764
    765
    766
    767
    768
    769
    770
    771
    772
    773
    774
    775
    776
    777
    778
    779
    780
    781
    782
    783
    784
    785
    786
    787
    788
    789
    790
    791
    <?php 
    error_reporting(E_ALL);
    ini_set('display_errors', 0);
     
    // maximise les possibilités de reprise d'upload en cas d'arrêt intempestif
    ignore_user_abort(true);
     
     
    class UploadAjaxABCIServeur 
    {
    	private $version = '4.5';
    	/* - IMPORTANT : Vous pouvez modifier les valeurs de $this->reponse_upload['erreur'] (bien qu'elles aient très peu de chances d'apparaître si les paramètres sont correctement configurés) mais PAS les valeurs de $this->reponse_upload['resultat'] qui sont des commandes ajax et qui de toutes façons n'apparaîtront jamais dans la réponse html.
    	
    	- Si vous étendez cette classe et que vous surchargez la fonction "Transfert()", faire attention de supprimer le cookie identifiant le fichier en cas de succès, ainsi que d'attribuer la valeur "upload_ok" à la variable $this->reponse_upload['resultat'] afin de permettre au script javascript de se poursuivre correctement.
    	*/
     
     
    	//  --------------- Gestion des erreurs fatales ----------------------
     
    	//cf mode d'emploi, chapître CONFIGURATION DU SCRIPT PHP D'UPLOAD
     
    	/* Les messages d'erreurs seront concaténés au message défini dans la classe javascript avec "info.status.erreur".
    	
    	- Si aucune des deux fonctions "cathErrorServeur()" ou "setModeDebug()" n'est utilisée, les erreurs fatales ne seront pas transmises et seul le message javascript s'affichera.
    	
    	- La fonction "cathErrorServeur($tableau)" demande un tableau en paramètre et permet de personnaliser le retour des erreurs fatales. L'index des valeurs est constitué par une suite de mots génériques renvoyés par l'erreur du serveur, et les valeurs sont constituées soit du message personnalisé à afficher, soit d'un tableau constitué du message personnalisé comme premier élément et de la valeur "true" (ou d'une valeur non nulle) comme second élément pour indiquer de supprimer le fichier temporaire et l'éventuel cookie du fichier. Exemple :
    
    	$tab_erreurs = array();
    	
    	$tab_erreurs['Allowed memory size'] = array("Mémoire insuffisante, le fichier est trop gros pour être redimensionné.",true); // le cookie et le fichier de sauvegarde seront supprimés
    	
    	$tab_erreurs['Maximum execution time'] = "Le temps d'exécution maximum du script est dépassé, rechargez votre image et réessayez !"; // le cookie et le fichier de sauvegarde seront préservés
    
    	$up->cathErrorServeur($tab_erreurs);
    
    	Voir le mode d'emploi pour plus d'explications. 
    	*/
     
    	public function cathErrorServeur ($array_erreur)
    	{
    		is_array($array_erreur) && count($array_erreur) > 0 ? $this->config_erreur_serveur = $array_erreur : '';
    	}
     
     
    	// Fonction à utiliser juste après l'initialisation de la classe pour retourner les erreurs fatales non attrapées par la fonction "cathErrorServeur()" précédente. A n'utiliser qu'en phase de développement.
    	public function setModeDebug ()
    	{
    		ini_set('display_errors', 1);
    		$this->mode_debug = true;
    	}
     
     
    	/*  --------------- Récupération des paramètres de la requête Ajax ----------------------
    	
    	cf mode d'emploi, chapître CONFIGURATION DU SCRIPT PHP D'UPLOAD
    	
    	Vous pourrez récupérer les valeurs des champs input éventuellement ajoutés dans le formulaire avec la fonction php "urldecode"*:
    
    	$ma_variable = isset($_POST['ma_variable'])*? urldecode($_POST['ma_variable'])*: null;
    	
    	
    	Récupération des paramètres spécifiques de la requête Ajax 
    	Des paramètres spécifiques à la classe javascript peuvent être récupérés en complément :
    	
    	public $UpAbci_form est un tableau de données spécifique à la classe. Il est renseigné dans tous les cas, excepté pour la requête complémentaire de confirmation de fin de traitement du formulaire qui est envoyée si et uniquement si l'option de configuration javascript  "config.queryFormEnd" = true. Dans ce cas et uniquement pour cette requête additionnelle, le tableau sera vide et vous pourrez récupérer les informations depuis "public $UpAbci_formEnd" évoqué plus bas.
    	
    	Liste des index renseignés* :
    	
    	Dans tous les cas :
    		- id_form
    		- uniqid_form
    		- iteration_form 	nombre d'itérations de la requête ajax pour le formulaire	(remise à zéro pour chaque nouvelle soumission du formulaire)
    	
    	
    	Si un fichier est joint au formulaire :
    		- input_name		nom de l'input de type file
    		- uniqid_file
    		- cook_name
    		- name
    		- size
    		- type
    		- lastModified
    		- qte_save		quantité sauvegardée en continu
    		- qte_upload
    		- result *		"ok_done", "backup_done", "error_done", "backup_fail", 	"error_fail", ou "0_0" 
    						préfixe = état du fichier, suffixe = état de la requête.
    		- time_start
    		- time_end
    		- iteration 	nombre d'itérations de la requête ajax pour le fichier
    	
    	* A noter que "result" est le résultat final renseigné en javascript au retour de la requête ajax. Sa valeur sera donc toujours 0_0 côté serveur excepté si vous configurez l'option config.queryFormEnd = true pour envoyer une requête additionnelle en fin de traitement du formulaire.
    			
    	Suivant le contexte, la requête ajax envoie d'autres variables  :
    	
    		
    	- public $UpAbci_formEnd 	Uniquement disponible à la fin du traitement du formulaire si l'option de 	
    								configuration javascript "config.queryFormEnd = true". 
    								Retourne un tableau de tableaux d'informations (1 pour chaque fichier)
    								avec le même contenu que "$UpAbci_form" cité plus haut. 
    								Si aucun fichier n'est joint, le tableau  renverra seulement les trois index "id_form", 
    								"uniqid_form" et  "iteration_form".
    								Si l'option javascript n'a pas été configurée ou si ce n'est pas la fin du 	
    								traitement du formulaire $UpAbci_formEnd retourne un tableau vide.
    	
    	protected $UpAbci_blobSlice   	renvoie "true" si le fichier est en plusieurs morceaux
    			
    	protected $UpAbci_fileEnd 		renvoie "true" si c'est la fin du fichier (dernière partie).
    			
    	protected $UpAbci_fragment 		renvoie le fragment de ficher, ou la valeur 1 si une sauvegarde complète est trouvée 
    									lors de la sélection du fichier.
    	
    	
    	La méthode getParam($index) retourne les valeurs du tableau "$UpAbci_form" sinon éventuellement les valeurs de "$UpAbci_formEnd[0]" si  $index = "id_form" ou  $index = "uniqid_form"  ou $index = "iteration_form" (pour être pratique).
    	
    	Exemple*:
    	$name = $up->getParam('name');  // retourne le nom du fichier
    	(retourne false si l'index n'existe pas)
    	*/
     
    	public function getParam ($index)
    	{
    		if(isset($this->UpAbci_form[$index]))
    		{
    			return $this->UpAbci_form[$index];
    		}
    		else if(isset($this->UpAbci_formEnd[0][$index]))
    		{
    			switch ($index)
    			{
    				case 'id_form' :
    				case 'uniqid_form' :
    				case 'iteration_form' : return $this->UpAbci_formEnd[0][$index];break;
    			} 
    		}
    		return false;
    	}
     
     
    	/* 
    	getFileEnd() retourne true si c'est la fin du fichier sinon false. Retourne indéfini si aucun fragment de fichier n'est joint dans la requête. 
    	A NOTER que cette fonction retourne la valeur $UpAbci_fileEnd (cité plus haut) envoyée par javascript avant tout traitement du fichier par le serveur. Utilisez plutôt la fonction "getTempAdressFileComplete()" après la fonction "Upload()" pour avoir confirmation que le fichier est correctement enregistré dans le dossier temporaire du serveur ou "getTransfertOk()" après la fonction "Transfert ()" pour avoir confirmation que le fichier est transféré correctement dans son emplacement définitif.
    	*/
    	public function getFileEnd()
    	{
    		return $this->UpAbci_fileEnd;
    	}
     
     
    	public function saveAll ($value = true)
    	{// A utiliser impérativement AVANT la fonction Upload. Cette fonction permet d'utiliser le répertoire temporaire pour stocker tous les fichiers y compris ceux dont la taille est inférieure à la taille des fragemnts. 
    		$this->save_all = $value;
    	}
     
     
    	public function getFragment ()
    	{// retourne true si un fichier est joint dans la requête (ou si une sauvegarde complète a été trouvée pour le fichier).
    		return isset($this->UpAbci_fragment);
    	}
     
     
    	public function getFragmentSize ()
    	{// retourne la taille du fragment. NE PAS UTILISER pour tester la présence d'un fragment car si une sauvergarde complète est trouvée cette valeur sera indéfinie donc égale à zéro. Seule l'utilisation de getFragment() doit être utilisée pour tester la présence d'un fichier ou d'un fragment joint au post du formulaire.
    		return isset($this->UpAbci_fragment['size']) ? $this->UpAbci_fragment['size'] : 0;
    	}
     
     
    	public function getCleanFileName ()
    	{// nom du fichier nettoyé
    		return $this->cleanFname;
    	}
     
     
    	public function getFileDestination ()
    	{// destination avec nom de fichier nettoyé
    		return $this->file_destination;
    	}
     
     
    	public function getRelativeAddress ()
    	{// adresse par rapport à laquelle sont définis les chemins des dossiers
    		return $this->adresse_relative;
    	}
     
     
    	public function ReturnOctets($val)
    	{// retourne des octets depuis une chaine formatée comme 100 Mo ou 1 g
    		$val = str_replace(array(',',' '),array('.',''),$val);
    		$val = rtrim($val, "oO");
     
    		$last = strtolower(substr($val,-1));
     
    		switch($last)
    		{
    			case 't':  $val *= 1024;
    			case 'g':  $val *= 1024;
    			case 'm': $val *= 1024;
    			case 'k':  $val *= 1024;
    		}
    		return $val;
    	}
     
     
    	public function addInfosServer ($value)
    	{// Ajoute un message texte ou html dans le retour d'information général du formulaire ayant la classe "UpAbci_infosServer". Pourra également être récupéré en second paramètre des fonctions javascript événementielles "config.func_FileEndEach" et "config.func_FormEnd"
    		$this->reponse_upload = array_merge($this->reponse_upload,array("infos_server" => $value));
    	}
     
     
    	public function addMixteServer($mixte)
    	{// Envoie un contenu texte, html ou un tableau de données qui pourra être récupéré en troisième paramètre des fonctions javascript événementielles "config.func_FileEndEach" et "config.func_FormEnd". N'affiche rien dans le html. Vous devrez exploiter ces données comme bon vous semble.
    		$this->reponse_upload = array_merge($this->reponse_upload,array("mixte_server" => $mixte));
    	}
     
     
    	/* Stoppe la soumission du formulaire. Cette commande ne sort pas du script en cours, utilisez exitReponseAjax() par la suite.
    	Si l'option de configuration javascript config.queryFormEnd = true l'éventuelle requête de confirmation de fin de formulaire sera envoyée uniquement si le paramètre $query_end vaut true. 
    	*/
    	public function stopForm($query_end = false)
    	{	
    		$this->reponse_upload['stop_form'] = trim($query_end) != false ? 1 : 0;// ne pas modifier
    	}
     
     
    	/* 
    	Sort du script en ajoutant un message qui sera concaténé au statut "info.status.erreur" de la classe javascript et envoyé dans le bloc html du fichier ayant la classe "UpAbci_status". Ne transmet PAS les éventuels messages précédemment ajoutés avec les fonctions addInfosServer() ou addMixteServer(), dans ce cas utilisez la fonction addStatusErreur($value). 
    	*/
    	public function exitStatusErreur ($value)
    	{ 
    		exit(json_encode(array('erreur' => $value)));
    	}
     
     
    	// à utiliser AVANT la fonction "Upload" (si vous l'utilisez après, le fichier devra être téléchargé avant que le visiteur puisse avoir l'information)
    	public function VerifExtensions($fichier,$extensions)
    	{
    		$filesExtensions = is_array($extensions) ? array_map('strtolower',$extensions) : array();
    		$extension_fichier = strtolower(pathinfo($fichier, PATHINFO_EXTENSION));
    		// si le tableau des extensions autorisées est vide on accepte toutes les extensions					 
    		if (count($filesExtensions) == 0 || in_array($extension_fichier,$filesExtensions))				 
    		return true;
    		else
    		return false;                  
    	}
     
     
    	/* Ajoute un message qui sera concaténé au statut "info.status.erreur" de la classe javascript et envoyé dans le bloc html ayant la classe "UpAbci_status". Ne sort pas du script, utilisez exitReponseAjax() par la suite. 
    	A utiliser après la fonction "Upload" si vous souhaitez préserver un fichier partiellement ou totalement téléchargé.
    	*/
    	public function addStatusErreur($value)
    	{
    		if(empty($this->reponse_upload['erreur'])) 
    		{
    			$this->reponse_upload['erreur'] = $value;
    		}
    		$this->reponse_upload['resultat'] = 'add_status_erreur';// ne pas modifier
    		return false;
    	}
     
     
    	// à utiliser APRES la fonction "Upload"
    	public function getTempAdressFileComplete()
    	{// retourne l'adresse du fichier temporaire s'il est complet et valide sinon false
    		return $this->fichier_verif ? $this->file_temp_address : false;
    	}
     
     
    	// à utiliser APRES la fonction "Upload"
    	public function getTempAdressFile()
    	{// retourne l'adresse du fichier temporaire. Peut être un fragment de fichier.
    		return is_file($this->file_temp_address)? $this->file_temp_address : false;
    	}
     
     
    	// à utiliser APRES la fonction "Upload" supprime le cookie de sauvegarde
    	public function deleteCookieSave()
    	{
    		setcookie($this->cookie_name,"",time()-3600,$this->cookie_path);
    	}
     
     
    	/* A utiliser AVANT la fonction "Transfert" et de préférence après avoir vérifié que le fichier est complet afin de minimiser l'utilisation de cette fonction qui peut être assez gourmande en ressource (en fonction du nombre de fichiers du répertoire) si le deuxième paramètre est renseigné pour renommer les fichiers en mode incrémental.
    	
    	 "RenameIdenticName()" renomme le fichier téléchargé si un fichier de même nom existe déjà sur le serveur. 
    	Par défaut la fonction ajoute un identifiant unique (uniqid) au nom des fichiers.
    	- Avec un second argument optionnel quelconque (ex : $up->RenameIdenticName($destination_fichier,'incr');) le nom des fichiers est incrémenté.  
    	- Un troisième argument optionnel casse sensivitive est également disponible, mais à n'utiliser que sur les serveurs casse sensitive (NE PAS UTILISER AVEC LES SERVEURS WINDOWS).
    	- Ne touchez pas aux paramètres 4 et 5.
    	*/
    	public function RenameIdenticName($adresse_fichier, $incr = false, $unix = false, $stop = 0, $isfile = false)
    	{
    		if ($isfile || is_file($adresse_fichier))
    		{
    			$info = pathinfo($adresse_fichier);
    			$extension = isset($info['extension']) && $info['extension'] != '' ? '.'.$info['extension'] : null;
    			$dossier = $info['dirname'];
    			$filename = $info['filename'];
     
    			if (trim($incr) != false && $stop < 90)// le stop arbitrtaire est une mesure de sécurité au cas où...
    			{
    				$file = addcslashes($filename,'.');			
    				$ext = isset($extension) ? addcslashes($extension,'.') : null;									
     
    				$match = trim($unix) != false ? '#^'.$file.'-[0-9]+'.$ext.'$#' : '#^'.$file.'-[0-9]+'.$ext.'$#i';
     
    				$tab_identique = array();
     
    				$files = new RegexIterator(new DirectoryIterator($dossier),$match);
    				foreach ($files as $fileinfo) $tab_identique[] = $fileinfo->getFilename();
     
    				natsort($tab_identique);
     
    				$dernier = array_pop($tab_identique);
     
    				unset($tab_identique);
     
    				$dernier = isset($dernier)? pathinfo($dernier, PATHINFO_FILENAME) : '';
     
    				$file = preg_replace_callback('#([0-9]+$)#', create_function('$matches','return $matches[1]+1;'), $dernier, '1', $count);
     
    				$filename = !empty($count)? $file : $filename.'-1';
    			}
    			else
    			{
    				$filename .= '-'.uniqid();
    			}
     
    			$filename = isset($extension) ? $filename.$extension : $filename;												
     
    			$adresse = $dossier.'/'.$filename;
     
    			if (!is_file($adresse)) return $adresse;
    			else																													
    			return Rename_fich($adresse_fichier, $incr, $unix, ++$stop, true);                        
    		}																				 
    		else 
    		{
    			return $adresse_fichier;
    		}
    	}
     
     
    	// à utiliser normalement APRES la fonction "Transfert"
    	public function addStatusOk ($value)
    	{// ajoute un message qui sera concaténé au statut "this.info.status.ok" de la classe javascript et envoyé dans le bloc html ayant la classe "UpAbci_status"
    		$this->reponse_upload = array_merge($this->reponse_upload,array("ok" => $value));
    	}
     
     
    	// à utiliser APRES la fonction "Transfert" (a le même effet que de tester le retour de la fonction Transfert())
    	public function getTransfertOk ()
    	{// le fichier est complet et a été déplacé avec succès vers son emplacement définitif
    		return isset($this->reponse_upload['resultat']) && $this->reponse_upload['resultat'] == 'upload_ok';
    	}
     
     
    	// Retour d'information OBLIGATOIRE et INDISPENSABLE pour le script ajax excepté si la fonction exitStatusErreur() a été utilisée.
    	public function exitReponseAjax()
    	{
    		exit(json_encode($this->reponse_upload));
    	}
     
     
    	// ------------------------------------------------------------------------------- 
    	// -------------------------------------------------------------------------------
     
     
    	// Variables ajax 
    	public $UpAbci_form = array();
    	public $UpAbci_formEnd = array();
    	protected $UpAbci_fragment;
    	protected $UpAbci_blobSlice;
    	protected $UpAbci_fileEnd;
     
     
    	// Variables php
    	protected $dossier_destination;
    	protected $dossier_temporaire;
    	protected $cleanFname;
    	protected $cookie_time;
    	protected $cookie_path;
    	protected $adresse_relative;
    	protected $verif_filesize_sup2Go;
    	protected $cookie_name;
    	protected $cookie_filesize;
    	protected $file_temp_address;
    	protected $file_destination;
    	protected $fichier_verif = false;
    	protected $reponse_upload = array();
    	protected $config_erreur_serveur = array();
    	protected $mode_debug = false;
    	protected $save_all = false;
     
     
    	public function __construct($dossier_destination = null, $dossier_temporaire = null, $cookie_heures = null, $cookie_path = null, $adresse_relative = null, $verif_filesize_sup2Go = false)
    	{
    		$this->dossier_destination = trim($dossier_destination);
    		$this->dossier_temporaire = trim($dossier_temporaire);
    		$this->cookie_time = is_numeric($cookie_heures) && $cookie_heures > 0 ? time()+3600*$cookie_heures : time()+3600*24;
    		$this->cookie_path = trim($cookie_path) != false ?  trim($cookie_path) : '/';		
    		$this->adresse_relative = trim($adresse_relative) != '' ? $adresse_relative : str_replace('\\','/',__DIR__).'/';
    		$this->verif_filesize_sup2Go = trim($verif_filesize_sup2Go) != false;
     
    		$this->GetPostFile();		
    	}
     
     
    	private function GetPostFile()
    	{
    		$UpAbci_form = isset($_POST['UpAbci_form']) ? $_POST['UpAbci_form'] : null;
    		if(!empty($UpAbci_form)) 
    		{
    			parse_str($UpAbci_form, $this->UpAbci_form);			
    		}
     
    		$UpAbci_formEnd = isset($_POST['UpAbci_formEnd']) && is_array($_POST['UpAbci_formEnd']) ? $_POST['UpAbci_formEnd'] : array() ;
    		if(count($UpAbci_formEnd) > 0)
    		{
    			$output = array();
    			foreach($UpAbci_formEnd as $value)
    			{
    				parse_str($value, $output);
    				$this->UpAbci_formEnd[] = $output;
    			}
    		}
     
     
     
     
    		$this->UpAbci_fragment = isset($_FILES['UpAbci_fragment']) ? $_FILES['UpAbci_fragment'] : null;
    		$this->UpAbci_fragment = !isset($this->UpAbci_fragment) && filter_input(INPUT_POST, 'UpAbci_fragment') ? 1 : $this->UpAbci_fragment;// si post UpAbci_fragment existe c'est que le script javascript à trouvé une sauvegarde complète et a remplacé file UpAbci_fragment par post UpAbci_fragment.
     
    		if(isset($this->UpAbci_fragment)) 
    		{
    			$this->cleanFname = $this->CleanFileName($this->getParam("name"));				
     
    			$this->UpAbci_blobSlice = urldecode(filter_input(INPUT_POST, 'UpAbci_blobSlice'));
    			$this->UpAbci_blobSlice = $this->UpAbci_blobSlice == 1;
     
    			$this->UpAbci_fileEnd = urldecode(filter_input(INPUT_POST, 'UpAbci_fileEnd'));
    			$this->UpAbci_fileEnd = $this->UpAbci_fileEnd == 1;
     
    			$this->cookie_name = $this->getParam('cook_name');
     
    			$cook_save = isset($_COOKIE[$this->cookie_name]) ? urldecode($_COOKIE[$this->cookie_name]) : null;
    			$cook_save = isset($cook_save) ? explode('|',$cook_save) : null;
    			$cook_save_temp_adresse = isset($cook_save[0]) ? $cook_save[0] : null; 
    			$this->cookie_filesize = isset($cook_save[1]) ? $cook_save[1] : 0; 
     
    			$this->file_temp_address = isset($cook_save_temp_adresse) ? $cook_save_temp_adresse : $this->adresse_relative.$this->dossier_temporaire.hash("sha256",(uniqid($this->getParam("uniqid_form"),true).uniqid($this->getParam("uniqid_file"),true)));	
     
    			$this->file_destination = $this->adresse_relative.$this->dossier_destination.$this->cleanFname;	
    		}
     
    		register_shutdown_function(array($this, 'Shutdown'));
     
    	}
     
     
     
    	public function Upload ()
    	{			
    		if(isset($this->UpAbci_fragment)) 
    		{
    			// Permet de récupérer le fichier temporaire s'il existe, s'il est complet et s'il n'est pas corrompu. Peut-être utile au cas où une erreur php se serait produite lors d'un traitement après l'upload complet (crop etc.). Evite d'attendre à nouveau pour le téléchargement lors des essais ultérieurs.
    			if ($this->cookie_filesize == $this->getParam("size") && $this->UpAbci_fileEnd && $this->UpAbci_fragment === 1)
    			{
    				$size_upload = @filesize($this->file_temp_address);
     
    				if($size_upload == $this->getParam("size"))
    				{
    					$this->fichier_verif = true;
    					return true;
    				}
    			}
    			// si $this->UpAbci_fragment === 1 => pas de fichier joint mais uniquement ses coordonnées pour récupérer la sauvegarde. Si l'on a passé la condition précédente c'est que la sauvegarde est non valide et l'on sort.
    			if ($this->UpAbci_fragment === 1) 
    			{
    				$this->reponse_upload['erreur'] = 'Fichier temporaire non valide.';
    				setcookie($this->cookie_name,"",time()-3600,$this->cookie_path);
    				@unlink($this->file_temp_address);
    				return false;
    			}
     
    			// Vérifs			
    			if($this->getParam("uniqid_file") == '')
    			{
    				$this->reponse_upload['erreur'] = 'Identifiant de fichier non valide.';
    				return false;
    			}
     
    			if($this->getParam("name") == '')
    			{
    				$this->reponse_upload['erreur'] = 'Nom de fichier non valide.';
    				return false;
    			}
     
    			if($this->getParam("size") == '')
    			{
    				$this->reponse_upload['erreur'] = 'Taille du fichier non valide.';
    				return false;
    			}
     
    			if(!is_uploaded_file($this->UpAbci_fragment['tmp_name']))
    			{
    				$this->reponse_upload['erreur'] = 'Provenance du fichier non valide.';
    				return false;					
    			}
     
    			// uploads
    			if(!$this->UpAbci_blobSlice && !$this->save_all) // si le fichier est d'un seul morceau et que saveAll() n'a pas été configuré
    			{
    				$this->file_temp_address = $this->UpAbci_fragment['tmp_name'];
    			}
    			else
    			{
    				 // On ouvre ou on crée le fichier
    				$fichier_cible = @fopen($this->file_temp_address, 'a+');
    				if($fichier_cible === false)
    				{
    					$this->reponse_upload['erreur'] = 'Erreur d\'ouverture du fichier temporaire.';
    					return false;
    				}
     
    				// On ouvre le contenu téléchargé
    				$upload_file = @fopen($this->UpAbci_fragment['tmp_name'], 'rb');
    				if($upload_file === false)
    				{
    					$this->reponse_upload['erreur'] = 'Erreur d\'ouverture du contenu téléchargé.';
    					return false;
    				}
     
    				// On lit son contenu dans une variable
    				$upload_size = $this->UpAbci_fragment['size'];
    				$upload_content = @fread($upload_file, $upload_size);
    				if($upload_content === false)
    				{
    					$this->reponse_upload['erreur'] = 'Erreur de lecture du contenu téléchargé.';
    					setcookie($this->cookie_name,"",time()-3600,$this->cookie_path);
    					@unlink($this->file_temp_address);
    					return false;
    				}	
     
    				fclose($upload_file);
     
    				// On l'écrit dans le fichier temporaire
    				if(@fwrite($fichier_cible, $upload_content) === false)
    				{
    					$this->reponse_upload['erreur'] = 'Erreur d\'écriture du contenu téléchargé.';
    					return false;
    				}	
     
    				unset($upload_content);
     
    				fclose($fichier_cible);
     
    				$new_file_size = $this->cookie_filesize + $upload_size;
     
    				setcookie($this->cookie_name,urlencode($this->file_temp_address.'|'.$new_file_size),$this->cookie_time,$this->cookie_path);
     
    				if (!$this->UpAbci_fileEnd)
    				{
    					if( !((isset($this->reponse_upload['resultat']) && $this->reponse_upload['resultat'] == 'add_status_erreur') || isset($this->reponse_upload['stop_form'])))
    					{
    						$this->reponse_upload['resultat'] = 'continu';
    						return true;
    					}
    				}
    			}
     
    			if ($this->UpAbci_fileEnd)
    			{
    				$this->fichier_verif = true;
     
    				// vérification de l'intégrité du fichier (automatique pour les fichiers de moins de 2 Go)
    				if ($this->verif_filesize_sup2Go || $this->getParam("size") < $this->ReturnOctets('2 Go'))
    				{
    					$size_upload = @filesize($this->file_temp_address);
     
    					if($size_upload != $this->getParam("size"))
    					{
    						$this->fichier_verif = false;
     
    						if($this->UpAbci_blobSlice || $this->save_all)
    						{
    							setcookie($this->cookie_name,"",time()-3600,$this->cookie_path);
     
    							$this->reponse_upload['erreur'] = 'Erreurs possibles : la sauvegarde utilisée a été enregistrée lors d\'un instant critique. Ou vous avez téléchargé ce même fichier simultanément depuis deux fenêtres différentes.';
    							return false;
    						}
    						else
    						{
    							$this->reponse_upload['erreur'] = 'Erreurs dans la vérification de l\'intégrité du fichier.';
    							return false;
    						}
    					}
    				}
    			}
     
    			return true;
    		}
     
    		return false;
    	}
     
     
     
    	public function Transfert ($file_destination = null)
    	{		
    		$this->file_destination = trim($file_destination) != '' ? $file_destination : $this->file_destination;
     
    		if($this->UpAbci_fileEnd)
    		{
    			if(isset($_COOKIE[$this->cookie_name]) || $this->save_all)
    			{
    				setcookie($this->cookie_name,"",time()-3600,$this->cookie_path);
    			}		
     
    			if(trim($this->file_destination) == '')
    			{
    				$this->reponse_upload['erreur'] = 'Destination du fichier non valide.';
    				return false;
    			}
     
    			if(!is_file($this->file_temp_address) || !$this->fichier_verif)
    			{
    				$this->reponse_upload['erreur'] = 'Fichier temporaire non valide.';
    				return false;
    			}
     
    			if(@rename($this->file_temp_address,$this->file_destination)) 
    			{
    				$this->reponse_upload['resultat'] = 'upload_ok';
    				return true;
    			}
    			else
    			{
    				$this->reponse_upload['resultat'] = false;
    				$this->reponse_upload['erreur'] = 'Problème dans le transfert du fichier.';
    				return false;
    			}
    		}
     
    		return false;
    	}
     
     
     
    	// La fonction "CleanFileName" est utilisée par défaut dans la fonction "GetPostFile" elle-même appelée par le constructeur de la classe
    	public function CleanFileName($nom_fichier)
    	{
    		$info = pathinfo($nom_fichier);
    		$extension = isset($info['extension']) && $info['extension'] != '' ? '.'.$info['extension'] : null;
    		$dossier = $info['dirname'] != '.' ? $info['dirname'].'/' : null  ;
    		$filename = $info['filename'];
     
    		$cible = array(
    		'À', 'Á', 'Â', 'Ã', 'Ä', 'Å', 'Æ', 'Ă', 'Ą',
    		'Ç', 'Ć', 'Č', 'Œ',
    		'Ď', 'Đ',
    		'à', 'á', 'â', 'ã', 'ä', 'å', 'æ', 'ă', 'ą',
    		'ç', 'ć', 'č', 'œ',
    		'ď', 'đ',
    		'È', 'É', 'Ê', 'Ë', 'Ę', 'Ě',
    		'Ğ',
    		'Ì', 'Í', 'Î', 'Ï', 'İ',
    		'Ĺ', 'Ľ', 'Ł',
    		'è', 'é', 'ê', 'ë', 'ę', 'ě',
    		'ğ',
    		'ì', 'í', 'î', 'ï', 'ı',
    		'ĺ', 'ľ', 'ł',
    		'Ñ', 'Ń', 'Ň',
    		'Ò', 'Ó', 'Ô', 'Õ', 'Ö', 'Ø', 'Ő',
    		'Ŕ', 'Ř',
    		'Ś', 'Ş', 'Š',
    		'ñ', 'ń', 'ň',
    		'ò', 'ó', 'ô', 'ö', 'ø', 'ő',
    		'ŕ', 'ř',
    		'ś', 'ş', 'š',
    		'Ţ', 'Ť',
    		'Ù', 'Ú', 'Û', 'Ų', 'Ü', 'Ů', 'Ű',
    		'Ý', 'ß',
    		'Ź', 'Ż', 'Ž',
    		'ţ', 'ť',
    		'ù', 'ú', 'û', 'ų', 'ü', 'ů', 'ű',
    		'ý', 'ÿ',
    		'ź', 'ż', 'ž',
    		'А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ё', 'Ж', 'З', 'И', 'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р',
    		'а', 'б', 'в', 'г', 'д', 'е', 'ё', 'ж', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'р',
    		'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Ъ', 'Ы', 'Ь', 'Э', 'Ю', 'Я',
    		'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', 'ъ', 'ы', 'ь', 'э', 'ю', 'я'
    		);
     
    		$rempl = array(
    		'A', 'A', 'A', 'A', 'A', 'A', 'AE', 'A', 'A',
    		'C', 'C', 'C', 'CE',
    		'D', 'D',
    		'a', 'a', 'a', 'a', 'a', 'a', 'ae', 'a', 'a',
    		'c', 'c', 'c', 'ce',
    		'd', 'd',
    		'E', 'E', 'E', 'E', 'E', 'E',
    		'G',
    		'I', 'I', 'I', 'I', 'I',
    		'L', 'L', 'L',
    		'e', 'e', 'e', 'e', 'e', 'e',
    		'g',
    		'i', 'i', 'i', 'i', 'i',
    		'l', 'l', 'l',
    		'N', 'N', 'N',
    		'O', 'O', 'O', 'O', 'O', 'O', 'O',
    		'R', 'R',
    		'S', 'S', 'S',
    		'n', 'n', 'n',
    		'o', 'o', 'o', 'o', 'o', 'o',
    		'r', 'r',
    		's', 's', 's',
    		'T', 'T',
    		'U', 'U', 'U', 'U', 'U', 'U', 'U',
    		'Y', 'Y',
    		'Z', 'Z', 'Z',
    		't', 't',
    		'u', 'u', 'u', 'u', 'u', 'u', 'u',
    		'y', 'y',
    		'z', 'z', 'z',
    		'A', 'B', 'B', 'r', 'A', 'E', 'E', 'X', '3', 'N', 'N', 'K', 'N', 'M', 'H', 'O', 'N', 'P',
    		'a', 'b', 'b', 'r', 'a', 'e', 'e', 'x', '3', 'n', 'n', 'k', 'n', 'm', 'h', 'o', 'p',
    		'C', 'T', 'Y', 'O', 'X', 'U', 'u', 'W', 'W', 'b', 'b', 'b', 'E', 'O', 'R',
    		'c', 't', 'y', 'o', 'x', 'u', 'u', 'w', 'w', 'b', 'b', 'b', 'e', 'o', 'r'
    		);
     
    		$nom_fichier = str_replace($cible, $rempl, $filename);// préserve le maximum de caractères utiles
     
    		$nom_fichier = preg_replace('#[^.a-z0-9_-]+#i', '-', $nom_fichier);// uniquement alphanumérique et . et _ et -
    		$nom_fichier = preg_replace('#-{2,}#','-',$nom_fichier);// supprime les occurences successives de '-'
     
    		// Supprime le dernier "-" de remplacement excepté si ce caractère existait déjà à la fin du nom original
    		$nom_fichier = substr($filename, -1) != "-" ? rtrim($nom_fichier,'-') : $nom_fichier;
     
    		return $dossier.$nom_fichier.$extension;
    	}
     
     
     
    	public function Shutdown()
    	{
    		$fatal_error = false;
    		if ($error = error_get_last())
    		{
    			switch($error['type'])
    			{
    				case E_ERROR:
    				case E_CORE_ERROR:
    				case E_COMPILE_ERROR:
    				case E_USER_ERROR:
    				$fatal_error = true;
    				break;
    			}
    		}
     
    		if ($fatal_error)
    		{
    			$message = null;
    			foreach($this->config_erreur_serveur as $key => $value)
    			{
    				if (strpos($error['message'],$key) !== false)
    				{
    					if(is_array($value))
    					{
    						$message = isset($value[0])? $value[0] : '';
    						if(isset($value[1]) && trim($value[1]) != false)
    						{
    							setcookie($this->cookie_name,"",time()-3600,$this->cookie_path);
    							@unlink($this->file_temp_address);
    						}
    					}
    					else
    					{
    						$message = $value;
    					}
    				}
    			}
     
    			if(!isset($message) && $this->mode_debug)
    			{
    				$message = $error['message'];
    			}
     
    			exit($message);
    		}
    	}
    }
    ?>
    -le fichier func_RedimImage.php:
    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
    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
    <?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 false
    // ---------------------
    // La FONCTION : func_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 = func_RedimImage(120,80,'reppicto/','monpicto.jpg','repimage/','monimage.jpg','jpg');
    // if ($redimOK==true) { echo 'Redimensionnement OK !';  }
    // ---------------------------------------------------
    function func_RedimImage($W_max, $H_max, $rep_Dst, $img_Dst, $rep_Src, $img_Src, $extension_Src) 
    {
    		//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 = 0;
    	// 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 = array('jpg','jpeg','png','gif');
     
    	if(!in_array($extension_Src,$ext_redim)) return false;
    	// ---------------------
     
    	// 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)) return false;
    	// ------------------------
    	// 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); // 1 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); // 1 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); // 1 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)) return false;
     
    	// ---------------------------------------------
    	// 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));
    							if(!is_resource($Ress_Dst)) return false;
    							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);
    							}
     
    							if(!is_resource($Ress_Dst)) return false;
    							break;
     
    			default : $Ress_Dst = null;
    		}
     
    		// 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) return false;
    	}
    	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) return false;
    	// ------------------------
    	// liberation des ressources-image
    	imagedestroy ($Ress_Src);
    	imagedestroy ($Ress_Dst);
     
    	return true;
    }
    ?>
    -le fichier UploadAjaxABCI.js:
    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
    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
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    392
    393
    394
    395
    396
    397
    398
    399
    400
    401
    402
    403
    404
    405
    406
    407
    408
    409
    410
    411
    412
    413
    414
    415
    416
    417
    418
    419
    420
    421
    422
    423
    424
    425
    426
    427
    428
    429
    430
    431
    432
    433
    434
    435
    436
    437
    438
    439
    440
    441
    442
    443
    444
    445
    446
    447
    448
    449
    450
    451
    452
    453
    454
    455
    456
    457
    458
    459
    460
    461
    462
    463
    464
    465
    466
    467
    468
    469
    470
    471
    472
    473
    474
    475
    476
    477
    478
    479
    480
    481
    482
    483
    484
    485
    486
    487
    488
    489
    490
    491
    492
    493
    494
    495
    496
    497
    498
    499
    500
    501
    502
    503
    504
    505
    506
    507
    508
    509
    510
    511
    512
    513
    514
    515
    516
    517
    518
    519
    520
    521
    522
    523
    524
    525
    526
    527
    528
    529
    530
    531
    532
    533
    534
    535
    536
    537
    538
    539
    540
    541
    542
    543
    544
    545
    546
    547
    548
    549
    550
    551
    552
    553
    554
    555
    556
    557
    558
    559
    560
    561
    562
    563
    564
    565
    566
    567
    568
    569
    570
    571
    572
    573
    574
    575
    576
    577
    578
    579
    580
    581
    582
    /* !UploadAjaxABCI Version 4.5 */
    var UploadAjaxABCI = function(i, e, t) {
        this.id_form = i, this.upload_serveur = e, this.content_result_tag = t && "" != $.trim(t) ? t : "", this.iteration_form = 0, this.config = {}, this.info = {}, this.info.status = {}, this.info.recoveryBackupConfirm = {}, this.config.ajaxTimeOut = 500, this.config.filesExtensions = [], this.config.filesExtensionsInput = [], this.config.fileSizeMax = null, this.config.customFileSelect = null, this.config.customDragAndDrop = !0, this.config.cssSubmitOn = null, this.config.cssFileSelectOn = null, this.config.imgPreviewStartAuto = !0, this.config.imgPreviewMaxSize = null, this.config.imgPreviewMaxSizeCancelAll = !1, this.config.imgPreviewMaxSizeTotal = null, this.config.imgPreviewMaxWidth = 90, this.config.imgPreviewMaxHeight = 60, this.config.infosRefresh = 1, this.config.remainingTimeCompute = 10, this.config.remainingTimeDisplayAfter = 30, this.config.recoveryBackupConfirm = !1, this.config.submitWithoutFile = !0, this.config.submitWithoutFileFuncFormEnd = !1, this.config.queryFormEnd = !1, this.config.BackupFormDependency = !0, this.config.cookiePath = "/", this.config.fragmentSize = 4194304, this.config.browserOutdeted = "Navigateur obsolète incompatible", this.config.serverFatalErrorDisplay = !0, this.config.uniqidForm = this.SHA1(this.Uniqid("UploadAjaxABCI", !0)), this.info.status.ok = "Téléchargement ok", this.info.status.inProgress = "Téléchargement en cours", this.info.status.stop = "Arrêt", this.info.status.errorSize = "Dépassement de la taille maximale autorisée.", this.info.status.errorExtension = "Extension non valide.", this.info.status.errorServer = "Echec du téléchargement. ", this.info.remainingTimeComputeWaiting = "calcul en cours", this.info.unitsSpacing = "&nbsp;", this.info.recoveryBackupConfirm.name = "Récupération du fichier : ", this.info.recoveryBackupConfirm.size = "\nSauvegarde en cours : ", this.info.recoveryBackupConfirm.message = '\n\nCliquez sur "OK" pour compléter ce fichier ou sur "Annuler" pour réinitialiser le téléchargement.', this.info.queryEndErrorServer = "Echec dans la finalisation du traitement serveur. ", this.func_SubmitForm, this.func_ImgPreviewStartAll, this.config.func_ImgPreviewLoadEach = null, this.config.func_FileSelectAllBefore = null, this.config.func_FileSelectEach = null, this.config.func_FileSelectAll = null, this.config.func_onFormSubmit = null, this.config.func_FormSubmit = null, this.config.func_FileInProgressEach = null, this.config.func_FileEndEach = null, this.config.func_FormEnd = null, this.params = $(["status", "name", "size", "imgPreview", "progressionG", "progressionT", "backup", "percentage", "duration", "remainingTime", "stop", "inputFileName"]), this.formulaire = $(), this.content_result = $(), this.tab_fichiers = [], this.tab_fichiers_change = [], this.data_files = $(), this.custom_select_file = $(), this.data_nofile = $(), this.bouton_submit = $(), this.css_envoi_select_ini = {}, this.obj_ini = {}, this.obj_ini.html = {}, this.obj_ini.es = {}, this.count_files = 0, this.infos_serveur = $(), this.stopAll = $(), this.requete = !0, this.win_url = window.URL || window.webkitURL, this.data_drop, this.retour_infos_server, this.retour_mixte_server, this.query_end = !1, this.paramServer = function(i) {
            var e = {};
            return e.id_form = this.id_form, e.uniqid_form = this.config.uniqidForm, e.iteration_form = ++this.iteration_form, i && (e.input_name = i.fichier.upabciInputName, e.uniqid_file = i.uniqid_file, e.cook_name = i.cook_name, e.name = i.fichier.name, e.size = i.fichier.size, e.type = i.fichier.type, e.lastModified = i.fichier.lastModified, e.qte_save = i.qte_save, e.qte_upload = i.qte_upload, e.result = i.result, e.time_start = i.time_start, e.time_end = i.time_end, e.iteration = i.iteration), $.param(e, !1)
        }, this.GetCssData = function(i) {
            var e = {},
                t = [];
            return $.each(i.split(";"), function(i, n) {
                t = n.split(":"), 2 == t.length && (e[t[0]] = t[1])
            }), e
        }, this.GetCssIni = function(i, e) {
            var t = {};
            return "object" == typeof i ? ($.each(i, function(i, n) {
                t[i] = void 0 != e.css(i) ? e.css(i) : "default"
            }), t) : !1
        }, this.GetTime = function() {
            var i = new Date;
            return i.getTime()
        }, this.FormateTime = function(i, e, t) {
            var n = {};
            n.h = Math.floor(i / 3600);
            var o = i % 3600;
            n.m = Math.floor(o / 60), 0 == n.h && (n.s = Math.floor(o % 60));
            var s = "";
            return $.each(n, function(i, e) {
                e > 0 && (s += e + t + i + t)
            }), s = "" != s ? s.substring(0, s.length - t.length) : e
        }, this.FormateBits = function(i, e) {
            for (var t = ["", "K", "M", "G", "T", "P", "E", "Z", "Y"], n = 0; i >= 1024;) i /= 1024, n++;
            i = "M" == t[n] || "K" == t[n] || "" == t[n] ? Math.round(10 * i) / 10 : Math.round(1e3 * i) / 1e3;
            var o = "" == t[n] ? "octets" : "o";
            return i + "" + e + t[n] + o
        }, this.ReturnOctets = function(i) {
            var e = String(i);
            e = e.replace(/,/, "."), e = e.replace(/ /g, ""), e = e.replace(/[oO]/, "");
            var t = e.substr(e.length - 1, 1).toLowerCase();
            switch (e = parseFloat(e), t) {
                case "t":
                    e *= 1024;
                case "g":
                    e *= 1024;
                case "m":
                    e *= 1024;
                case "k":
                    e *= 1024
            }
            return e
        }, this.AfficheErreur = function(i) {
            var e = "";
            return $.each(i, function(i, t) {
                switch (t) {
                    case "taille":
                        e += n.info.status.errorSize;
                        break;
                    case "extension":
                        e += n.info.status.errorExtension;
                        break;
                    case "preview":
                        e += n.info.status.erreur_preview
                }
            }), e
        }, this.Pourcentage = function(i, e, t) {
            return void 0 != e && e > 0 ? Math.round(i / e * 100) + "" + t + "%" : "0" + t + "%"
        }, this.GetUniqueID = function(i, e, t, n) {
            var o = this.SHA1(i.toString() + e.toString() + t.toString() + n.toString());
            return "a" + this.SHA1(this.Uniqid(o, !0))
        }, this.FormatIni = function(i, e) {
            var t = i.html(),
                n = $.trim(t).split(" "),
                o = parseInt(n[0]),
                s = n.length,
                r = s > 1 ? " " : "";
            n = s > 1 ? [] : $.trim(t).split("&nbsp;"), r = n.length > 1 ? "&nbsp;" : r, r = isNaN(o) ? this.info.unitsSpacing : r, this.obj_ini.html[e] = t, this.obj_ini.es[e] = r
        }, this.QteSauvegarde = function(i) {
            var e = this.docCookies.getItem(i),
                t = null != e ? decodeURIComponent(e).split("|") : null;
            return null != t && void 0 != t[1] ? parseInt(t[1]) : 0
        };
        var n = this;
        this.ImgPrevisualisation = function(i) {
            var e = document.createElement("img");
            e.src = this.win_url.createObjectURL(i.fichier), e.onload = function() {
                n.win_url.revokeObjectURL(this.src);
                var t, o, s, r = e.width,
                    a = e.height;
                if (i.img_width = r, i.img_height = a, 0 != n.config.imgPreviewMaxWidth && 0 != n.config.imgPreviewMaxHeight) {
                    var c = r / n.config.imgPreviewMaxWidth,
                        f = a / n.config.imgPreviewMaxHeight,
                        u = Math.max(c, f);
                    t = r / u, o = a / u, s = r > t || a > o
                } else 0 == n.config.imgPreviewMaxWidth && 0 != n.config.imgPreviewMaxHeight ? (o = n.config.imgPreviewMaxHeight, t = o * (r / a), s = a > n.config.imgPreviewMaxHeight) : 0 != n.config.imgPreviewMaxWidth && 0 == n.config.imgPreviewMaxHeight && (t = n.config.imgPreviewMaxWidth, o = t * (a / r), s = r > n.config.imgPreviewMaxWidth);
                s && (r = t, a = o), $(e).attr({
                    width: r,
                    height: a
                }), i.obj.imgPreview.append(e), "function" == typeof n.config.func_ImgPreviewLoadEach && n.config.func_ImgPreviewLoadEach(e, i)
            }
        }, this.func_ImgPreviewStartAll = function() {
            0 == n.config.imgPreviewStartAuto && $.each(n.tab_fichiers_change, function(i, e) {
                1 == e.img_prev_delayed && n.ImgPrevisualisation(e)
            })
        }, this.attrData = function(i, e) {
            var t = i.attr("data-upabcicss-" + e);
            void 0 != t && i.css(this.GetCssData(t))
        }, this.SetCssData = function(i, e) {
            this.attrData(this.content_result, e), this.attrData(this.infos_serveur, e), this.attrData(i, e), i.find("*").each(function() {
                n.attrData($(this), e)
            })
        }, this.SetCssDataAll = function(i) {
            this.attrData(this.content_result, i), this.attrData(this.infos_serveur, i), this.attrData(this.formulaire, i), this.formulaire.find("*").each(function() {
                n.attrData($(this), i)
            }), this.CR_not_include && this.content_result.find("*").each(function() {
                n.attrData($(this), i)
            })
        }, this.ArretFormate = function(i) {
            void 0 != n.tab_fichiers_change[i.data.index] ? n.tab_fichiers_change[i.data.index].stop = 1 : void 0 != n.tab_fichiers[i.data.index] && (n.tab_fichiers[i.data.index].stop = 1), i.data.qte_save > 0 ? (n.SetCssData(i.data.infos_html, "backup"), n.SetCssData(i.data.infos_html, "result"), n.SetCssData(i.data.infos_html, "result-stop"), n.SetCssData(i.data.infos_html, "result-partial")) : (n.SetCssData(i.data.infos_html, "result"), n.SetCssData(i.data.infos_html, "result-stop")), void 0 != i.data.status && i.data.status.html(n.info.status.stop)
        }, this.ArreterToutAvantEnvoi = function() {
            n.stopAll && n.tab_fichiers_change.length > 0 && n.stopAll.off("click").one("click", function() {
                $.each(n.tab_fichiers_change, function(i, e) {
                    e.obj.stop && e.obj.stop.off("click"), e.stop_all = 1;
                    var t = {};
                    t.data = {}, t.data.infos_html = e.infos_html, t.data.status = e.obj.status, t.data.index = i, t.data.qte_save = n.QteSauvegarde(e.cook_name), n.ArretFormate(t)
                })
            })
        }
    };
    UploadAjaxABCI.prototype.Start = function() {
        function i(i) {
            i.stopPropagation(), i.preventDefault()
        }
     
        function e() {
            f.custom_select_file.length > 0 && ($.event.props.push("dataTransfer"), f.custom_select_file.each(function(e) {
                $(this).off("click").off("drop"), void 0 != f.data_files.eq(e) && (1 == f.config.customDragAndDrop && $(this).on({
                    drop: function(t) {
                        i(t);
                        var n = t.dataTransfer.files;
                        return n && 0 != n.length ? (f.data_drop = n, void f.data_files.eq(e).change()) : !1
                    },
                    dragover: function(e) {
                        i(e)
                    }
                }), $(this).on("click", function(t) {
                    i(t), f.data_drop = void 0, f.data_files.eq(e).click()
                }))
            }))
        }
     
        function t(e) {
            var t = this.name;
            "function" == typeof f.config.func_FileSelectAllBefore && f.config.func_FileSelectAllBefore(e, f.tab_fichiers_change);
            var n = e.data.index;
            i(e);
            var o = $(),
                s = document.createElement("div");
            f.content_result.length > 0 && (f.content_result.empty().append(d), f.stopAll = f.content_result.find(".UpAbci_stopAll"), o = f.content_result.find(".UpAbci_infosFile"), o.wrap(s), s = o.parent()), f.stopAll = f.stopAll.length > 0 ? f.stopAll : f.formulaire.find(".UpAbci_stopAll"), s.empty(), b[n] = [];
            var r = !1;
            v[n] = 0;
            var a = void 0 != f.data_drop ? f.data_drop : this.files;
            $(a).each(function(i, e) {
                e.upabciTypeImage = 0, e.upabciErrorPreview = 0, e.upabciErrorSize = 0, e.upabciErrorExtension = 0, e.upabciErrorUser = 0, e.upabciInputName = t, e.type.match("image.*") && (e.upabciTypeImage = 1, null != f.config.imgPreviewMaxSize && e.size > parseInt(f.config.imgPreviewMaxSize) ? (e.upabciErrorPreview = 1, 1 == f.config.imgPreviewMaxSizeCancelAll && (r = !0)) : v[n] += e.size), null != f.config.fileSizeMax && e.size > f.config.fileSizeMax && (e.upabciErrorSize = 1, e.upabciErrorUser++);
                var o = e.name.substr(e.name.lastIndexOf(".") + 1).toLowerCase();
                if (f.config.filesExtensions.length > 0 && -1 == $.inArray(o, f.config.filesExtensions) && (e.upabciErrorExtension = 1, e.upabciErrorUser++), Array.isArray(f.config.filesExtensionsInput[t]) && f.config.filesExtensionsInput[t].length > 0) {
                    var s = $.map(f.config.filesExtensionsInput[t], function(i) {
                        return i.toLowerCase()
                    }); - 1 == $.inArray(o, s) && (e.upabciErrorExtension = 1, -1 == $.inArray(o, f.config.filesExtensions) && e.upabciErrorUser++)
                }
                b[n].push(e)
            });
            var c = 0;
            $.each(v, function(i, e) {
                i != n && (c += e)
            }), c += v[n];
            var u, l = [];
            $.each(f.tab_fichiers_change, function(i, e) {
                u = e.fichier.upabciInputName, u != t && (l[u] = Array.isArray(l[u]) ? l[u] : [], l[u].push(e))
            }), f.tab_fichiers_change = [];
            var h = 0,
                m = {};
            return $.each(b, function(i, t) {
                t && $.each(t, function(i, t) {
                    var n, a = {},
                        u = $(),
                        p = $(),
                        _ = $(),
                        d = 0,
                        g = -1,
                        v = 0,
                        b = [],
                        S = f.GetUniqueID(f.backup_dependency, h, t.name, t.size),
                        C = f.SHA1(f.backup_dependency.toString() + t.name.toString() + t.size.toString()),
                        j = f.QteSauvegarde(C);
                    Array.isArray(l[t.upabciInputName]) && $.each(l[t.upabciInputName], function(i, e) {
                        C == e.cook_name && (d = e.stop)
                    }), o.length > 0 && (p = o.clone(!0), f.params.each(function(i, e) {
                        if (_ = p.find(".UpAbci_" + e), _.length > 0) {
                            switch (e) {
                                case "status":
                                    u = p.find(".UpAbci_status");
                                    break;
                                case "name":
                                    _.html(t.name);
                                    break;
                                case "size":
                                    f.FormatIni(_, e), _.html(f.FormateBits(t.size, f.obj_ini.es[e]));
                                    break;
                                case "imgPreview":
                                    1 == t.upabciTypeImage && (r || void 0 == f.win_url || (null == f.config.imgPreviewMaxSizeTotal || c <= f.config.imgPreviewMaxSizeTotal ? 0 == t.upabciErrorPreview ? (f.SetCssData(p, "image-preview"), 0 == f.config.imgPreviewStartAuto ? g = 1 : (g = 0, v = 1)) : f.SetCssData(p, "error-img-prev") : f.SetCssDataAll("error-img-prev-total")));
                                    break;
                                case "progressionG":
                                    _.get(0).value = j, _.get(0).max = t.size;
                                    break;
                                case "progressionT":
                                    f.FormatIni(_, e), j > 0 && _.html(f.FormateBits(j, f.obj_ini.es.progressionT));
                                    break;
                                case "backup":
                                    f.FormatIni(_, e), j > 0 && _.html(f.FormateBits(j, f.obj_ini.es.backup));
                                    break;
                                case "percentage":
                                    f.FormatIni(_, e), _.html(f.Pourcentage(j, t.size, f.obj_ini.es.percentage));
                                    break;
                                case "duration":
                                    f.FormatIni(_, e);
                                    break;
                                case "remainingTime":
                                    f.FormatIni(_, e);
                                    break;
                                case "stop":
                                    0 == t.upabciErrorUser && $(_).one("click", {
                                        infos_html: p,
                                        status: u,
                                        index: h,
                                        qte_save: j
                                    }, f.ArretFormate), 1 == d && $(_).click();
                                    break;
                                case "inputFileName":
                                    _.html(t.upabciInputName)
                            }
                            a[e] = _
                        }
                    }), t.upabciErrorUser > 0 && (f.SetCssData(p, "error-user"), f.SetCssData(p, "result"), f.SetCssData(p, "result-error"), u.length > 0 && (1 == t.upabciErrorExtension && b.push("extension"), 1 == t.upabciErrorSize && b.push("taille"), n = f.AfficheErreur(b), u.html(n))), j > 0 && f.SetCssData(p, "backup")), s.append(p), h++, m = {
                        fichier: t,
                        uniqid_file: S,
                        obj: a,
                        infos_html: p,
                        cook_name: C,
                        qte_save: j,
                        qte_save_ini: j,
                        qte_upload: 0,
                        time_start: 0,
                        time_end: 0,
                        result: "0_0",
                        stop: d,
                        stop_all: 0,
                        iteration: 0,
                        img_prev_delayed: g,
                        img_width: 0,
                        img_height: 0
                    }, 1 == v && f.ImgPrevisualisation(m), f.tab_fichiers_change.push(m), "function" == typeof f.config.func_FileSelectEach && f.config.func_FileSelectEach(e, m)
                })
            }), o.length > 0 && f.content_result.find(".UpAbci_infosFile").unwrap(), f.ArreterToutAvantEnvoi(), f.tab_fichiers_change.length > 0 && (f.SetCssDataAll("select-file"), "function" == typeof f.config.func_FileSelectAll && f.config.func_FileSelectAll(e, f.tab_fichiers_change)), !1
        }
     
        function n() {
            f.data_files.each(function(i, e) {
                $(this).on("change", {
                    index: i
                }, t)
            }), e()
        }
     
        function o() {
            var i;
            f.data_files.each(function() {
                i = document.createElement("div"), $(this).wrap(i), i = $(this).parent(), g.push(i.html()), $(this).unwrap()
            })
        }
     
        function s(i, e) {
            var t;
            f.data_files.each(function(i, e) {
                t = document.createElement("div"), $(this).wrap(t), t = $(this).parent(), $(this).remove(), t.append($(g[i])), t.find('input[type="file"]').unwrap()
            }), f.data_files = f.formulaire.find('input[type="file"]'), i && (f.data_files.each(function() {
                p && 0 == f.custom_select_file.length && $(this).css(m), $(this).prop("disabled", !0).val("")
            }), "function" == typeof f.config.func_FormSubmit && f.config.func_FormSubmit(e, f.tab_fichiers)), n()
        }
     
        function r(i) {
            f.requete = !0, f.iteration_form = 0, b = [], v = {}, f.tab_fichiers = f.tab_fichiers_change, f.tab_fichiers_change = [], f.count_files = 0, 0 == f.tab_fichiers.length && d && f.content_result.empty().append(d), f.infos_serveur = f.formulaire.find(".UpAbci_infosServer"), f.infos_serveur = f.infos_serveur.length > 0 ? f.infos_serveur : f.content_result.find(".UpAbci_infosServer"), f.bouton_submit = f.formulaire.find('input[type="submit"]'), f.data_nofile = f.formulaire.serializeArray(), $.each(f.tab_fichiers, function(i, e) {
                0 == e.stop && 0 == e.fichier.upabciErrorUser && f.count_files++
            }), f.SetCssDataAll("submit"), f.count_files > 0 || f.config.submitWithoutFile ? (f.count_files > 0 && f.SetCssDataAll("submit-file"), f.data_files.each(function() {
                p && 0 == f.custom_select_file.length && (f.css_envoi_select_ini.data_files = f.GetCssIni(m, $(this)))
            }), f.custom_select_file.each(function() {
                p && f.custom_select_file.length > 0 && (f.css_envoi_select_ini.custom_select_file = f.GetCssIni(m, $(this)), $(this).css(m)), $(this).prop("disabled", !0)
            }), f.bouton_submit.each(function() {
                Object.keys(_).length && (f.css_envoi_select_ini.bouton_submit = f.GetCssIni(_, $(this)), $(this).css(_)), $(this).prop("disabled", !0)
            }), s(!0, i), f.Upload()) : (s(!1), f.data_files.prop("disabled", !1).val(""), f.SetCssDataAll("form-end"), 0 == f.config.submitWithoutFile && 1 == f.config.submitWithoutFileFuncFormEnd && "function" == typeof f.config.func_FormEnd && f.config.func_FormEnd(f.tab_fichiers))
        }
        if (this.formulaire = $(this.id_form), 0 == this.formulaire.length) return alert("Configuration UploadAjaxABCI : identifiant de formulaire non valide"), !1;
        if ("" != this.content_result_tag && 0 == $(this.content_result_tag).length) return alert("UploadAjaxABCI : identifiant de renvoi des résultats non valide"), !1;
        if (void 0 === window.FormData) {
            var a = this.config.browserOutdeted,
                c = $(this.config.customFileSelect);
            return "" != $.trim(a) && (this.formulaire.find('input[type="file"]').on("change", function() {
                return alert(a), !1
            }), this.formulaire.find('input[type="submit"]').on("click", function() {
                return alert(a), !1
            }), this.formulaire.find(c).on("click", function() {
                return alert(a), !1
            })), !1
        }
        var f = this;
        this.data_files = this.formulaire.find('input[type="file"]'), this.custom_select_file = "" != $.trim(this.config.customFileSelect) ? this.formulaire.find(this.config.customFileSelect) : $(), this.content_result = $(this.content_result_tag), this.CR_not_include = this.formulaire.find(this.content_result).length > 0 ? !1 : !0;
        var u = this.formulaire.find('input[name="UpAbci_uniqidForm"]');
        u = u.length > 0 ? u.val() : "", this.config.uniqidForm = "" != $.trim(u) ? u : this.config.uniqidForm;
        var l = this.formulaire.find('input[name="UpAbci_fragmentSize"]');
        l = l.length > 0 ? parseInt(l.val()) : void 0, l = isNaN(l) || 1048576 > l ? this.config.fragmentSize : l, this.config.fragmentSize = l - 10240;
        var h = "object" == typeof this.id_form ? this.id_form.attr("id") : this.id_form;
        if (this.id_form = void 0 == h ? this.id_form.attr("class") : this.id_form, this.id_form = void 0 != this.id_form ? this.id_form : "", 1 == this.config.BackupFormDependency && "" == this.id_form) return alert("Le formulaire ne comporte pas d'id ni de classe permettant de l'identifier.\n\nCette configuration n'est pas compatible avec l'option 'config.BackupFormDependency' qui vaut actuellement true.\n\nAjoutez une classe ou un id au formulaire ou ajoutez une option de configuration pour définir config.BackupFormDependency = false.\n\nL'upload ne sera pas fonctionnel tant que le problème ne sera pas résolu."), !1;
        this.backup_dependency = 1 == this.config.BackupFormDependency ? this.id_form : "", this.config.imgPreviewMaxSize = "" != $.trim(this.config.imgPreviewMaxSize) ? 1048576 * parseInt(this.config.imgPreviewMaxSize) : null, this.config.imgPreviewMaxSizeTotal = "" != $.trim(this.config.imgPreviewMaxSizeTotal) ? 1048576 * parseInt(this.config.imgPreviewMaxSizeTotal) : null, this.config.fileSizeMax = "" != $.trim(this.config.fileSizeMax) ? this.ReturnOctets(this.config.fileSizeMax) : null, this.config.filesExtensions = Array.isArray(this.config.filesExtensions) ? $.map(this.config.filesExtensions, function(i) {
            return i.toLowerCase()
        }) : [];
        var m = "" != $.trim(this.config.cssFileSelectOn) ? this.GetCssData(this.config.cssFileSelectOn) : {},
            p = Object.keys(m).length,
            _ = "" != $.trim(this.config.cssSubmitOn) ? this.GetCssData(this.config.cssSubmitOn) : {},
            d = $(),
            g = [],
            v = {},
            b = [];
        this.content_result.length > 0 && (d = this.content_result.html()), o(), n(), this.formulaire.on("submit", function(e) {
            i(e), "function" == typeof f.config.func_onFormSubmit ? (f.func_SubmitForm = function(i) {
                r(i)
            }, f.config.func_onFormSubmit(e, f.tab_fichiers_change)) : r(e)
        })
    }, UploadAjaxABCI.prototype.Upload = function(i, e, t) {
        function n() {
            var i = (A.GetTime() - d.time_start - (d.iteration - 1) * A.config.ajaxTimeOut) / 1e3,
                e = (d.qte_upload - d.qte_save_ini) / i;
            return v - d.qte_upload - e > 0
        }
     
        function o(i) {
            A.stopAll && d && 1 != d.stop_all && A.stopAll.off("click").one("click", function() {
                $.each(A.tab_fichiers, function(i, e) {
                    if (e.obj.stop && e.obj.stop.off("click"), e.stop_all = 1, i >= _) {
                        var t = {};
                        t.data = {}, t.data.infos_html = e.infos_html, t.data.status = e.obj.status, t.data.index = i, t.data.qte_save = A.QteSauvegarde(e.cook_name), A.ArretFormate(t)
                    }
                }), n() && i.abort()
            })
        }
     
        function s(i) {
            if (d) {
                var e = d.obj.status ? d.obj.status : $(),
                    t = A.QteSauvegarde(S);
                1 == d.stop ? (h(t, "now"), d.obj.remainingTime && d.obj.remainingTime.html(A.obj_ini.html.remainingTime), m(t), d.infos_html && (t > 0 && A.SetCssData(d.infos_html, "backup"), A.SetCssData(d.infos_html, "result"), A.SetCssData(d.infos_html, "result-stop"), t > 0 && A.SetCssData(d.infos_html, "result-partial")), d.obj.status && d.obj.status.html(A.info.status.stop), d.obj.stop && d.obj.stop.off("click"), i.abort()) : d.obj.stop && d.obj.stop.off("click").one("click", function() {
                    if (d.stop = 1, n()) {
                        var o = {};
                        o.data = {}, o.data.infos_html = d.infos_html, o.data.status = e, o.data.index = _, o.data.qte_save = t, A.ArretFormate(o), i.abort()
                    }
                })
            }
        }
     
        function r(i) {
            var e = void 0 != i ? i : b;
            d.obj.backup.html(A.FormateBits(e, A.obj_ini.es.backup))
        }
     
        function a(i) {
            d.obj.percentage.html(A.Pourcentage(i, d.fichier.size, A.obj_ini.es.percentage))
        }
     
        function c(i) {
            d.obj.progressionT.html(A.FormateBits(i, A.obj_ini.es.progressionT))
        }
     
        function f(i) {
            d.obj.duration.html(A.FormateTime(i, A.obj_ini.html.duration, A.obj_ini.es.duration))
        }
     
        function u(i, e) {
            var t = A.FormateTime(e, A.obj_ini.html.remainingTime, A.obj_ini.es.remainingTime);
            t = i > A.config.remainingTimeCompute ? t : A.info.remainingTimeComputeWaiting, d.obj.remainingTime.html(t)
        }
     
        function l(i, e) {
            var t = (i - d.qte_save_ini) / e;
            return t > 0 ? (d.fichier.size - i) / t : 0
        }
     
        function h(i, e) {
            var t, n = A.GetTime(),
                o = (n - d.time_start) / 1e3,
                s = n / 1e3;
            0 == C && (t = l(i, o), t > A.config.remainingTimeDisplayAfter && d.infos_html && (A.SetCssData(d.infos_html, "remaining-time-after"), C = 1)), 0 == j && o > A.config.remainingTimeCompute && (A.SetCssData(d.infos_html, "remaning-time-compute"), j = 1), (s - d.time_end > A.config.infosRefresh || void 0 != e) && (d.time_end = s, d.obj.backup && (void 0 != e ? r(i) : r()), d.obj.percentage && a(i), d.obj.progressionT && c(i), d.obj.duration && d.time_start > 0 && f(o), d.obj.remainingTime && d.time_start > 0 && (t = void 0 != t ? t : l(i, o), u(o, t)), "function" == typeof A.config.func_FileInProgressEach && A.config.func_FileInProgressEach(d))
        }
     
        function m(i) {
            d.obj.progressionG && (d.obj.progressionG.get(0).value = i, d.obj.progressionG.get(0).max = d.fichier.size)
        }
     
        function p(i) {
            var e = i.loaded,
                t = e + g;
            d && (d.qte_upload = t, m(t), h(t))
        }
        var _ = void 0 != i ? i : 0,
            d = this.tab_fichiers[_],
            g = void 0 != e ? e : 0,
            v = void 0 != t ? t : this.config.fragmentSize,
            b = 0,
            S = null,
            C = 0,
            j = 0,
            A = this;
        if (void 0 == d) {
            if (!(0 == this.count_files && this.config.submitWithoutFile || 1 == this.config.queryFormEnd && this.count_files > 0) || !this.requete) {
                if (this.count_files > 0) {
                    this.SetCssDataAll("upload-end");
                    var k = !1,
                        x = this;
                    $.each(this.tab_fichiers, function(i, e) {
                        x.docCookies.hasItem(e.cook_name) && (k = !0)
                    }), k && this.SetCssDataAll("backup-end")
                }
                return this.data_files.each(function() {
                    $(this).prop("disabled", !1), void 0 != A.css_envoi_select_ini.data_files && $(this).css(A.css_envoi_select_ini.data_files)
                }), this.bouton_submit.each(function() {
                    $(this).prop("disabled", !1), void 0 != A.css_envoi_select_ini.bouton_submit && $(this).css(A.css_envoi_select_ini.bouton_submit)
                }), this.custom_select_file.each(function() {
                    $(this).prop("disabled", !1), void 0 != A.css_envoi_select_ini.custom_select_file && $(this).css(A.css_envoi_select_ini.custom_select_file)
                }), this.SetCssDataAll("form-end"), "function" == typeof this.config.func_FormEnd && this.config.func_FormEnd(this.tab_fichiers, this.retour_infos_server, this.retour_mixte_server), !1
            }
            this.requete = !1
        } else {
            if (0 == g && (1 == d.stop || d.fichier.upabciErrorUser > 0)) return this.Upload(++_), !1;
            d.iteration++, S = d.cook_name, 0 == g && 0 == d.stop ? (d.infos_html && this.SetCssData(d.infos_html, "in-progress"), d.obj.status && d.obj.status.html(this.info.status.inProgress), b = d.qte_save_ini, b > 0 && (!this.config.recoveryBackupConfirm || confirm(this.info.recoveryBackupConfirm.name + "" + d.fichier.name + this.info.recoveryBackupConfirm.size + this.FormateBits(b, this.obj_ini.es.backup) + this.info.recoveryBackupConfirm.message) ? (g = b, v = g + this.config.fragmentSize) : (b = 0, d.qte_save = 0, d.qte_save_ini = 0, this.docCookies.removeItem(S, this.config.cookiePath))), d.time_end = 0, d.time_start = this.GetTime()) : b = this.QteSauvegarde(S), d.qte_save = b, d.infos_html && b > 0 && this.SetCssData(d.infos_html, "backup"), v = v > d.fichier.size ? d.fichier.size : v;
            var F, E = d.fichier.size > this.config.fragmentSize ? 1 : 0;
            F = b > 0 && b == g && g == v ? 1 : 1 == E ? d.fichier.slice(g, v) : d.fichier;
            var w = v == d.fichier.size ? 1 : 0
        }
        var y = new FormData;
        return this.data_nofile.length > 0 && $.each(this.data_nofile, function(i, e) {
            "UpAbci_uniqidForm" != e.name && y.append(e.name, e.value)
        }), d ? (y.append("UpAbci_form", A.paramServer(d)), y.append("UpAbci_blobSlice", encodeURIComponent(E)), y.append("UpAbci_fileEnd", encodeURIComponent(w)), y.append("UpAbci_fragment", F)) : 1 == this.config.queryFormEnd ? (this.query_end = !0, this.tab_fichiers.length > 0 ? $.each(this.tab_fichiers, function(i, e) {
            y.append("UpAbci_formEnd[" + i + "]", A.paramServer(e))
        }) : y.append("UpAbci_formEnd[0]", A.paramServer())) : y.append("UpAbci_form", A.paramServer()), $.ajax({
            url: this.upload_serveur,
            type: "POST",
            data: y,
            xhr: function() {
                var i = $.ajaxSettings.xhr();
                return i.upload && i.upload.addEventListener("progress", p, !1), i
            },
            processData: !1,
            contentType: !1,
            dataType: "json",
            beforeSend: function(i) {
                o(i), s(i)
            }
        }).done(function(i) {
            var e = void 0 != i.resultat ? i.resultat : null,
                t = void 0 != i.erreur ? i.erreur : "",
                n = void 0 != i.ok ? i.ok : "";
            if (void 0 != i.infos_server ? (A.SetCssDataAll("infos-server"), A.infos_serveur.length > 0 && A.infos_serveur.html(i.infos_server), A.retour_infos_server = i.infos_server) : A.retour_infos_server = void 0, void 0 != i.mixte_server ? A.retour_mixte_server = i.mixte_server : A.retour_mixte_server = void 0, "continu" == e && void 0 == i.stop_form) g = v, v += A.config.fragmentSize, setTimeout(function() {
                A.Upload(_, g, v)
            }, A.config.ajaxTimeOut);
            else {
                if (d) {
                    if (d.obj.stop && d.obj.stop.off("click"), d.obj.progressionT && d.obj.progressionT.html(A.obj_ini.html.progressionT), d.obj.remainingTime && d.obj.remainingTime.html(A.obj_ini.html.remainingTime), "upload_ok" == e) d.result = "ok_done", d.qte_save = 0, d.qte_upload = d.fichier.size, d.infos_html && (A.SetCssData(d.infos_html, "result"), A.SetCssData(d.infos_html, "result-ok")), d.obj.progressionG && m(d.fichier.size), d.obj.percentage && a(d.fichier.size), d.obj.status && d.obj.status.html(A.info.status.ok + "" + n), d.obj.backup && d.obj.backup.html(A.obj_ini.html.backup);
                    else if (A.docCookies.hasItem(S)) {
                        var o = A.QteSauvegarde(S);
                        d.result = "backup_done", d.qte_save = o, d.infos_html && (A.SetCssData(d.infos_html, "backup"), A.SetCssData(d.infos_html, "result"), A.SetCssData(d.infos_html, "result-partial"), A.SetCssData(d.infos_html, "result-error")), d.obj.status && d.obj.status.html(A.info.status.errorServer + "" + t), h(o, "now"), d.obj.remainingTime && d.obj.remainingTime.html(A.obj_ini.html.remainingTime), m(o)
                    } else d.result = "error_done", d.qte_save = 0, d.infos_html && (A.SetCssData(d.infos_html, "result"), A.SetCssData(d.infos_html, "result-error")), d.obj.status && d.obj.status.html(A.info.status.errorServer + "" + t), d.obj.backup && d.obj.backup.html(A.obj_ini.html.backup);
                    "function" == typeof A.config.func_FileEndEach && A.config.func_FileEndEach(d, A.retour_infos_server, A.retour_mixte_server)
                }
                void 0 != i.stop_form ? (0 == i.stop_form && (A.requete = !1), A.Upload(A.tab_fichiers.length)) : A.Upload(++_)
            }
        }).fail(function(i, e, t) {
            var n = void 0 != i.responseText && A.config.serverFatalErrorDisplay === !0 ? i.responseText : "";
            if (d) {
                if (d.obj.stop && d.obj.stop.off("click"), d.obj.progressionT && d.obj.progressionT.html(A.obj_ini.html.progressionT), d.obj.remainingTime && d.obj.remainingTime.html(A.obj_ini.html.remainingTime), A.docCookies.hasItem(S)) {
                    var o = A.QteSauvegarde(S);
                    d.result = "backup_fail", d.qte_save = o, d.infos_html && 1 != d.stop && (A.SetCssData(d.infos_html, "backup"), A.SetCssData(d.infos_html, "result"), A.SetCssData(d.infos_html, "result-partial"), A.SetCssData(d.infos_html, "result-error")), d.obj.status && 1 != d.stop && d.obj.status.html(A.info.status.errorServer + "" + n), h(o, "now"), d.obj.remainingTime && d.obj.remainingTime.html(A.obj_ini.html.remainingTime), m(o)
                } else d.result = "error_fail", d.qte_save = 0, d.infos_html && 1 != d.stop && (A.SetCssData(d.infos_html, "result"), A.SetCssData(d.infos_html, "result-error")), d.obj.backup && 1 != d.stop && d.obj.backup.html(A.obj_ini.html.backup), d.obj.status && 1 != d.stop && d.obj.status.html(A.info.status.errorServer + "" + n);
                "function" == typeof A.config.func_FileEndEach && A.config.func_FileEndEach(d, A.retour_infos_server, A.retour_mixte_server)
            } else 1 == A.query_end && (A.retour_infos_server = A.info.queryEndErrorServer + "" + n, A.SetCssDataAll("infos-server"), A.infos_serveur.length > 0 && A.infos_serveur.html(A.info.queryEndErrorServer + "" + n));
            A.Upload(++_)
        }), !1
    }, UploadAjaxABCI.prototype.Uniqid = function(i, e) {
        "undefined" == typeof i && (i = "");
        var t, n = function(i, e) {
            return i = parseInt(i, 10).toString(16), e < i.length ? i.slice(i.length - e) : e > i.length ? Array(1 + (e - i.length)).join("0") + i : i
        };
        return this.php_js || (this.php_js = {}), this.php_js.uniqidSeed || (this.php_js.uniqidSeed = Math.floor(123456789 * Math.random())), this.php_js.uniqidSeed++, t = i, t += n(parseInt((new Date).getTime() / 1e3, 10), 8), t += n(this.php_js.uniqidSeed, 5), e && (t += (10 * Math.random()).toFixed(8).toString()), t
    }, UploadAjaxABCI.prototype.SHA1 = function(i) {
        function e(i, e) {
            var t = i << e | i >>> 32 - e;
            return t
        }
     
        function t(i) {
            var e, t, n = "";
            for (e = 7; e >= 0; e--) t = i >>> 4 * e & 15, n += t.toString(16);
            return n
        }
     
        function n(i) {
            i = i.replace(/\r\n/g, "\n");
            for (var e = "", t = 0; t < i.length; t++) {
                var n = i.charCodeAt(t);
                128 > n ? e += String.fromCharCode(n) : n > 127 && 2048 > n ? (e += String.fromCharCode(n >> 6 | 192), e += String.fromCharCode(63 & n | 128)) : (e += String.fromCharCode(n >> 12 | 224), e += String.fromCharCode(n >> 6 & 63 | 128), e += String.fromCharCode(63 & n | 128))
            }
            return e
        }
        var o, s, r, a, c, f, u, l, h, m = new Array(80),
            p = 1732584193,
            _ = 4023233417,
            d = 2562383102,
            g = 271733878,
            v = 3285377520;
        i = n(i);
        var b = i.length,
            S = new Array;
        for (s = 0; b - 3 > s; s += 4) r = i.charCodeAt(s) << 24 | i.charCodeAt(s + 1) << 16 | i.charCodeAt(s + 2) << 8 | i.charCodeAt(s + 3), S.push(r);
        switch (b % 4) {
            case 0:
                s = 2147483648;
                break;
            case 1:
                s = i.charCodeAt(b - 1) << 24 | 8388608;
                break;
            case 2:
                s = i.charCodeAt(b - 2) << 24 | i.charCodeAt(b - 1) << 16 | 32768;
                break;
            case 3:
                s = i.charCodeAt(b - 3) << 24 | i.charCodeAt(b - 2) << 16 | i.charCodeAt(b - 1) << 8 | 128
        }
        for (S.push(s); S.length % 16 != 14;) S.push(0);
        for (S.push(b >>> 29), S.push(b << 3 & 4294967295), o = 0; o < S.length; o += 16) {
            for (s = 0; 16 > s; s++) m[s] = S[o + s];
            for (s = 16; 79 >= s; s++) m[s] = e(m[s - 3] ^ m[s - 8] ^ m[s - 14] ^ m[s - 16], 1);
            for (a = p, c = _, f = d, u = g, l = v, s = 0; 19 >= s; s++) h = e(a, 5) + (c & f | ~c & u) + l + m[s] + 1518500249 & 4294967295, l = u, u = f, f = e(c, 30), c = a, a = h;
            for (s = 20; 39 >= s; s++) h = e(a, 5) + (c ^ f ^ u) + l + m[s] + 1859775393 & 4294967295, l = u, u = f, f = e(c, 30), c = a, a = h;
            for (s = 40; 59 >= s; s++) h = e(a, 5) + (c & f | c & u | f & u) + l + m[s] + 2400959708 & 4294967295, l = u, u = f, f = e(c, 30), c = a, a = h;
            for (s = 60; 79 >= s; s++) h = e(a, 5) + (c ^ f ^ u) + l + m[s] + 3395469782 & 4294967295, l = u, u = f, f = e(c, 30), c = a, a = h;
            p = p + a & 4294967295, _ = _ + c & 4294967295, d = d + f & 4294967295, g = g + u & 4294967295, v = v + l & 4294967295
        }
        var h = t(p) + t(_) + t(d) + t(g) + t(v);
        return h.toLowerCase()
    }, UploadAjaxABCI.prototype.docCookies = {
        getItem: function(i) {
            return decodeURIComponent(document.cookie.replace(new RegExp("(?:(?:^|.*;)\\s*" + encodeURIComponent(i).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=\\s*([^;]*).*$)|^.*$"), "$1")) || null
        },
        setItem: function(i, e, t, n, o, s) {
            if (!i || /^(?:expires|max\-age|path|domain|secure)$/i.test(i)) return !1;
            var r = "";
            if (t) switch (t.constructor) {
                case Number:
                    r = t === 1 / 0 ? "; expires=Fri, 31 Dec 9999 23:59:59 GMT" : "; max-age=" + t;
                    break;
                case String:
                    r = "; expires=" + t;
                    break;
                case Date:
                    r = "; expires=" + t.toUTCString()
            }
            return document.cookie = encodeURIComponent(i) + "=" + encodeURIComponent(e) + r + (o ? "; domain=" + o : "") + (n ? "; path=" + n : "") + (s ? "; secure" : ""), !0
        },
        removeItem: function(i, e, t) {
            return i && this.hasItem(i) ? (document.cookie = encodeURIComponent(i) + "=; expires=Thu, 01 Jan 1970 00:00:00 GMT" + (t ? "; domain=" + t : "") + (e ? "; path=" + e : ""), !0) : !1
        },
        hasItem: function(i) {
            return new RegExp("(?:^|;\\s*)" + encodeURIComponent(i).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=").test(document.cookie)
        },
        keys: function() {
            for (var i = document.cookie.replace(/((?:^|\s*;)[^\=]+)(?=;|$)|^\s*|\s*(?:\=[^;]*)?(?:\1|$)/g, "").split(/\s*(?:\=[^;]*)?;\s*/), e = 0; e < i.length; e++) i[e] = decodeURIComponent(i[e]);
            return i
        }
    };
    -le fichier jquery.js

    Comme ces fichiers se retrouvent à la racine du site ... je pense avoir modifié les chemins d’accès des fichiers.

    Je lance une importation d'image et j'ai le message suivant:
    Echec du traitement. 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.
    Je vois pas d’où peut venir le problème je pense avoir mi tous les fichiers et les dossiers auquel le code fait appel et je pense bien avoir modifié tous les chemins d'accès ...

    Pouvez vous m'aidez s'il vous plait?

  8. #8
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 382
    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 382
    Points : 10 410
    Points
    10 410
    Par défaut
    Quand tu utilises le module avec sa configuration initiale sans modifier l'organisation des fichiers et des dossiers, est-ce que tout fonctionne correctement ?

    Si oui c'est que tu t'es mélangé les pinceaux dans la modification des liens entre les fichiers. Dans ce cas n'essaies pas de modifier le dossier "Upload-Ajax-ABCI". Le plus simple est de faire une copie du fichier qui contient le formulaire qui t'intéresse, puis de le renommer comme tu veux et de le placer où tu veux en suivant la procédure décrite ici.

    Si non il est fort probable que ton serveur ne supporte pas des upload de 4Mo. Dans ce cas, depuis la page index.html du module d'upload suit le lien "installation et debug".

  9. #9
    Membre habitué
    Homme Profil pro
    sans emploi
    Inscrit en
    Février 2014
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2014
    Messages : 365
    Points : 131
    Points
    131
    Par défaut
    Merci ACIWEB ça marche avec un formulaire ... mais ce que je veux faire est un peu plus complexe:

    Comment faire pour générer autant de formulaire d'importation qu'il y a a d’occurrence dans une bdd?
    Je m'explique ... dans ma page je me connecte à une table mysql (où chaque enregistrement a pour index id_photo) et je veux que le formulaire apparaisse autant de fois que la table comporte d'enregistrements
    A chaque formulaire je veux associer l'identifiant : id=form_redim+id_photo
    et pour la div: id=reponse_upload+id_photo

    Fichier UploadAjaxABCI_Redimensions.php renommé index.php:
    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
    123
    124
    125
    126
    127
    128
    129
    130
    <?php
    /* 
    Utilise le fichier "Php_Upload/UploadAjaxABCI_Php_Load_Redimensions_optimise.php" comme destination Ajax
    */
    session_start();
    header('Content-type: text/html; charset=UTF-8');
     
    $UpAbci_fragmentSize = 4194304;// taille maximale des fragments (doit être inférieur ou égal à la configuration 'upload_max_filesize' du serveur). Les fichiers inférieurs à cette taille n'auront pas de sauvegarde temporaire.
     
    $UpAbci_uniqidForm = hash("sha256",uniqid(rand(), true));
     
    // Jeton de formulaire (token);
    $_SESSION['UploadAjaxABCI'][$UpAbci_uniqidForm]['token'] = 1;
    ?>
    <!DOCTYPE html>
    <html lang="fr">
    <head>
    <meta charset="UTF-8" />
    <title>UploadAjaxABCI : upload de fichiers par fragmentation avec Html5 et Ajax/Jquery/Php</title>
    <style type="text/css">
    progress { 
    	width:100px;
    }
    </style>
    </head>
    <body style="font-family:Arial, Helvetica, sans-serif; font-size:0.8em;width:750px;margin:3em auto 0 auto;line-height:1.8em">
     
     
    				<?php
    					// Connexion MYSQL
    					// ---------------
    					try
    					{
    						$chaine_connexion='mysql:host=localhost;dbname=cemkay';
    						$connexion_bdd = new PDO($chaine_connexion, 'root', '', array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
    						$connexion_bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    					}
    					catch(PDOException $e)
    					{																		
    						$msg = 'ERREUR PDO dans ' . $e->getFile() . ' L.' . $e->getLine() . ' : ' . $e->getMessage();
    						exit($msg);
    					}				
     
    					//Preparer la requete
    					$sql = 'SELECT * FROM liste_image';
    					$requete2 = $connexion_bdd ->prepare($sql);
    					//Associer des valeurs aux place holders
     
    					//Compiler et executer la requete
    					$requete2->execute();
     
    					//Recuperer toutes les donnees retournees
    					foreach($requete2->fetchAll() as $donnee)
    						{
    							echo ('
    
    							<div style="margin-top:3em">
    							<form id="form_redim' . $donnee['id_photo'] . '" action="#" method="post">
    							 <fieldset style="border:2px solid #000;border-radius:5px;padding:1em">
    								<legend>Upload avec prévisualisation et 3 redimensionnements des images (si pas trop lourdes, depend de votre  serveur)</legend>
    								 <input type="file" name="upload_simple" multiple="multiple" />
    								 <input type="hidden" value="<?=$UpAbci_fragmentSize?>" name="UpAbci_fragmentSize" />
    								 <input type="hidden" value="<?=$UpAbci_uniqidForm?>" name="UpAbci_uniqidForm" />
    								 <input type="submit" value="Envoyer"/>
     
    								 <!-- Bloc conteneur du retour d informations -->
    								 <div id="reponse_upload' . $donnee['id_photo'] . '">
    									<!--information du fichier que l on affiche uniquement si un fichier est sélectionné, pour éviter la barre de progression graphique vide si soumission du formulaire sans fichier-->
    									 <div class="UpAbci_infosFile" style="display:none;margin-top:1em;clear:both" data-upabcicss-select-file="display:block;">
    										 <hr>
     
    										<span class="UpAbci_stop" style="color:red;cursor:pointer;font-size:0.8em;" data-upabcicss-result="display:none">stop </span>
     
    										<span class="UpAbci_name"></span><!-- nom du fichier -->
     
    										<progress class="UpAbci_progressionG"></progress> <!-- progression graphique -->
    										<span class="UpAbci_status" data-upabcicss-result-ok="color:green;font-weight:bold">en attente</span><!-- status (important sinon pas de retour d information en cas d erreur) -->
    										<span class="UpAbci_imgPreview" style="float:right"></span><!-- vignettes si le poids total ne dépasse pas la config javascript définie plus bas à 100Mo  -->
     
    										<p style="display:none;" data-upabcicss-result-partial="display:block">- sauvegardé : <span class="UpAbci_backup">0 Mo</span></p><!-- S affichera si une sauvegarde existe en cas d arrêr ou d erreur -->
     
    									 </div>
    								</div>
    							 </fieldset>
    							</form>
    							<p style="margin-top:3em;margin-bottom:3em"><a href="index.html">Index</a></p>
    							</div>
     
     
    								');
    						}	
     
    					//Clore la requete preparee
    					$requete2 -> closeCursor();
    					$requete2 = NULL;
    				?>		
     
    <script src="Upload-Ajax-ABCI/Javascript/jquery.js"></script>
    <script src="Upload-Ajax-ABCI/Javascript/UploadAjaxABCI.js"></script>
     
    <script type="text/javascript">
    // Initialisation de la classe javascript (identifiant formulaire, destination ajax, identifiant réponse)
     
    var destination_ajax = 'Upload-Ajax-ABCI/Php_Upload/UploadAjaxABCI_Php_Load_Redimensions_optimise.php';
    // Utilisez la destination ci-dessous pour comparer avec une solution standard beaucoup plus lente
    //destination_ajax = 'Php_Upload/UploadAjaxABCI_Php_Load_Redimensions.php';
     
    var up = new UploadAjaxABCI('#form_redim<?php echo $donnee["id_photo"]?>',destination_ajax,'#reponse_upload<?php echo $donnee["id_photo"]?>');
     
    // Extensions autorisées
    up.config.filesExtensions = ['jpg','jpeg','png','gif'];
     
    // S'affichera si le redimensionnement et l'upload sont ok.
    up.info.status.ok = "Upload et redimensionnements OK";
     
    // Message d'erreur si problème serveur. Sera complété par le message renvoyé par le serveur pour plus de précision.
    up.info.status.errorServer = "Echec du traitement. ";
     
    // les aperçus demandent pas mal de ressource, vous devriez baisser cette valeur ou supprimer la prévisualisation pour les portables.
    up.config.imgPreviewMaxSizeTotal = 100; // en Mo poids total maximum de toutes les photos. Au delà les vignettes ne seront pas affichées.
     
    up.config.imgPreviewMaxWidth = 100; // en pixels, largeur maximale de l'aperçu
    up.config.imgPreviewMaxHeight = 100;// en pixels, hauteur maximale de l'aperçu
     
    // Démarrage de la fonction, DOM chargé
    $(function(){up.Start()});
    </script>
     
    </body>
    </html>
    Lignes de code modifiées dans index.php:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var up = new UploadAjaxABCI('#form_redim<?php echo $donnee["id_photo"]?>',destination_ajax,'#reponse_upload<?php echo $donnee["id_photo"]?>');
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <div id="reponse_upload' . $donnee['id_photo'] . '">
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <form id="form_redim' . $donnee['id_photo'] . '" action="#" method="post">
    Résultat:
    La barre de progression n'apparait pas
    Et l’importation d'image ne fonctionne pas

    Pouvez vous m'aider?

    Cordialement

  10. #10
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 382
    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 382
    Points : 10 410
    Points
    10 410
    Par défaut
    Heu, sérieusement ? t'as pas l'impression d'être entrain de monter une usine à gaz ?

    Sur le principe y'a pas de souci tu remonte les deux lignes ci-dessous vers le haut dans le <head> de ta page
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <script src="Upload-Ajax-ABCI/Javascript/jquery.js"></script>
    <script src="Upload-Ajax-ABCI/Javascript/UploadAjaxABCI.js"></script>
    et le reste du code tu le mets dans ta boucle juste avant la fermeture du foreach.

    Enfin là tu te prépare un gros bin's. Surtout que le web supporte mal des upload (vers le serveur) simultanés. Et donc en appuyant sur plusieurs boutons à la suite ça risque de bloquer ou tout au moins ralentir très sérieusement... On a jamais à faire ça habituellement, à mon avis la logique de ton application n'est pas bonne.

  11. #11
    Membre habitué
    Homme Profil pro
    sans emploi
    Inscrit en
    Février 2014
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2014
    Messages : 365
    Points : 131
    Points
    131
    Par défaut
    Merci ACIWEB,

    ... oui sérieusement ... je veux essayer ...

    Le but final est d'afficher un tableau d’œuvre d'art et d'associer à chaque ligne une photo ...

    J'ai apporté les modifications à index.php:

    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
    123
    124
    125
    126
    127
    128
    129
    <?php
    /* 
    Utilise le fichier "Php_Upload/UploadAjaxABCI_Php_Load_Redimensions_optimise.php" comme destination Ajax
    */
    session_start();
    header('Content-type: text/html; charset=UTF-8');
     
    $UpAbci_fragmentSize = 4194304;// taille maximale des fragments (doit être inférieur ou égal à la configuration 'upload_max_filesize' du serveur). Les fichiers inférieurs à cette taille n'auront pas de sauvegarde temporaire.
     
    $UpAbci_uniqidForm = hash("sha256",uniqid(rand(), true));
     
    // Jeton de formulaire (token);
    $_SESSION['UploadAjaxABCI'][$UpAbci_uniqidForm]['token'] = 1;
    ?>
    <!DOCTYPE html>
    <html lang="fr">
    <head>
    <meta charset="UTF-8" />
    <title>UploadAjaxABCI : upload de fichiers par fragmentation avec Html5 et Ajax/Jquery/Php</title>
    <style type="text/css">
    progress { 
    	width:100px;
    }
    </style>
     
    <script src="Upload-Ajax-ABCI/Javascript/jquery.js"></script>
    <script src="Upload-Ajax-ABCI/Javascript/UploadAjaxABCI.js"></script>
     
    </head>
    <body style="font-family:Arial, Helvetica, sans-serif; font-size:0.8em;width:750px;margin:3em auto 0 auto;line-height:1.8em">
     
     
    				<?php
    					// Connexion MYSQL
    					// ---------------
    					try
    					{
    						$chaine_connexion='mysql:host=localhost;dbname=cemkay';
    						$connexion_bdd = new PDO($chaine_connexion, 'root', '', array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
    						$connexion_bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    					}
    					catch(PDOException $e)
    					{																		
    						$msg = 'ERREUR PDO dans ' . $e->getFile() . ' L.' . $e->getLine() . ' : ' . $e->getMessage();
    						exit($msg);
    					}				
     
    					//Preparer la requete
    					$sql = 'SELECT * FROM liste_image';
    					$requete2 = $connexion_bdd ->prepare($sql);
    					//Associer des valeurs aux place holders
     
    					//Compiler et executer la requete
    					$requete2->execute();
     
    					//Recuperer toutes les donnees retournees
    					foreach($requete2->fetchAll() as $donnee)
    						{
    							echo ('
    
    							<div style="margin-top:3em">
    							<form id="form_redim' . $donnee['id_photo'] . '" action="#" method="post">
    							 <fieldset style="border:2px solid #000;border-radius:5px;padding:1em">
    								<legend>Upload avec prévisualisation et 3 redimensionnements des images (si pas trop lourdes, depend de votre  serveur)</legend>
    								 <input type="file" name="upload_simple" multiple="multiple" />
    								 <input type="hidden" value="<?=$UpAbci_fragmentSize?>" name="UpAbci_fragmentSize" />
    								 <input type="hidden" value="<?=$UpAbci_uniqidForm?>" name="UpAbci_uniqidForm" />
    								 <input type="submit" value="Envoyer"/>
     
    								 <!-- Bloc conteneur du retour d informations -->
    								 <div id="reponse_upload' . $donnee['id_photo'] . '">
    									<!--information du fichier que l on affiche uniquement si un fichier est sélectionné, pour éviter la barre de progression graphique vide si soumission du formulaire sans fichier-->
    									 <div class="UpAbci_infosFile" style="display:none;margin-top:1em;clear:both" data-upabcicss-select-file="display:block;">
    										 <hr>
     
    										<span class="UpAbci_stop" style="color:red;cursor:pointer;font-size:0.8em;" data-upabcicss-result="display:none">stop </span>
     
    										<span class="UpAbci_name"></span><!-- nom du fichier -->
     
    										<progress class="UpAbci_progressionG"></progress> <!-- progression graphique -->
    										<span class="UpAbci_status" data-upabcicss-result-ok="color:green;font-weight:bold">en attente</span><!-- status (important sinon pas de retour d information en cas d erreur) -->
    										<span class="UpAbci_imgPreview" style="float:right"></span><!-- vignettes si le poids total ne dépasse pas la config javascript définie plus bas à 100Mo  -->
     
    										<p style="display:none;" data-upabcicss-result-partial="display:block">- sauvegardé : <span class="UpAbci_backup">0 Mo</span></p><!-- S affichera si une sauvegarde existe en cas d arrêr ou d erreur -->
     
    									 </div>
    								</div>
    							 </fieldset>
    							</form>
    							<p style="margin-top:3em;margin-bottom:3em"><a href="index.html">Index</a></p>
    							</div>
     
    <script type="text/javascript">
    // Initialisation de la classe javascript (identifiant formulaire, destination ajax, identifiant réponse)
     
    var destination_ajax = "Upload-Ajax-ABCI/Php_Upload/UploadAjaxABCI_Php_Load_Redimensions_optimise.php";
    // Utilisez la destination ci-dessous pour comparer avec une solution standard beaucoup plus lente
    //destination_ajax = "Php_Upload/UploadAjaxABCI_Php_Load_Redimensions.php";
     
    var up = new UploadAjaxABCI("#form_redim' . $donnee["id_photo"] . '",destination_ajax,"#reponse_uploadform_redim' . $donnee['id_photo'] . '");
     
    // Extensions autorisées
    up.config.filesExtensions = ["jpg","jpeg","png","gif"];
     
    // S affichera si le redimensionnement et l upload sont ok.
    up.info.status.ok = "Upload et redimensionnements OK";
     
    // Message d erreur si problème serveur. Sera complété par le message renvoyé par le serveur pour plus de précision.
    up.info.status.errorServer = "Echec du traitement. ";
     
    // les aperçus demandent pas mal de ressource, vous devriez baisser cette valeur ou supprimer la prévisualisation pour les portables.
    up.config.imgPreviewMaxSizeTotal = 100; // en Mo poids total maximum de toutes les photos. Au delà les vignettes ne seront pas affichées.
     
    up.config.imgPreviewMaxWidth = 100; // en pixels, largeur maximale de l aperçu
    up.config.imgPreviewMaxHeight = 100;// en pixels, hauteur maximale de l aperçu
     
    // Démarrage de la fonction, DOM chargé
    $(function(){up.Start()});
    </script>
    								');
    						}	
     
    					//Clore la requete preparee
    					$requete2 -> closeCursor();
    					$requete2 = NULL;
    				?>		
     
    </body>
    </html>
    Effectivement ça bugg:
    - 1er message d'erreur:
    UploadAjaxABCI : identifiant de renvoi des résultats non valide
    puis quand j appuie sur ok:
    - 2eme message d'erreur:
    UploadAjaxABCI : identifiant de renvoi des résultats non valide; empêcher cette page d'afficher d'ouvrir des dialogues supplémentaires

  12. #12
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 382
    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 382
    Points : 10 410
    Points
    10 410
    Par défaut
    Et tu as combien de lignes ?

    Oui y'a encore du travail parce que dans un echo de php ça risque de pas être top. Tu sais pas faire afficher du html (ou du javascript) à l'intérieur d'une condition php sans passer par un echo et reprendre ensuite le traitement php ?
    Et puis il faut remonter la closure javascript pour éviter des conflits entre les codes. Bon voici comment il faut faire :

    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
    <?php
    // Testé ok avec le tableau ci-dessous.
    /*
    $tab[] = array('id_photo' => 1);
    $tab[] = array('id_photo' => 2);
    $tab[] = array('id_photo' => 3);
    $tab[] = array('id_photo' => 4);
    foreach($tab as $donnee)
    */
    foreach($requete2->fetchAll() as $donnee)
    {?>
     
    	<div style="margin-top:3em">
    	<form id="form_redim<?=$donnee['id_photo']?>" action="#" method="post">
    	 <fieldset style="border:2px solid #000;border-radius:5px;padding:1em">
    		<legend>Upload avec prévisualisation et 3 redimensionnements des images (si pas trop lourdes, depend de votre  serveur)</legend>
    		 <input type="file" name="upload_simple" multiple="multiple" />
    		 <input type="hidden" value="<?=$UpAbci_fragmentSize?>" name="UpAbci_fragmentSize" />
    		 <input type="hidden" value="<?=$UpAbci_uniqidForm?>" name="UpAbci_uniqidForm" />
    		 <input type="hidden" value="<?=$donnee['id_photo']?>" name="id_photo_binco" />
    		 <input type="submit" value="Envoyer"/>
     
    		 <!-- Bloc conteneur du retour d informations -->
    		 <div id="reponse_upload<?=$donnee['id_photo']?>">
    			<!--information du fichier que l on affiche uniquement si un fichier est sélectionné, pour éviter la barre de progression graphique vide si soumission du formulaire sans fichier-->
    			 <div class="UpAbci_infosFile" style="display:none;margin-top:1em;clear:both" data-upabcicss-select-file="display:block;">
    				 <hr>
     
    				<span class="UpAbci_stop" style="color:red;cursor:pointer;font-size:0.8em;" data-upabcicss-result="display:none">stop </span>
     
    				<span class="UpAbci_name"></span><!-- nom du fichier -->
     
    				<progress class="UpAbci_progressionG"></progress> <!-- progression graphique -->
    				<span class="UpAbci_status" data-upabcicss-result-ok="color:green;font-weight:bold">en attente</span><!-- status (important sinon pas de retour d information en cas d erreur) -->
    				<span class="UpAbci_imgPreview" style="float:right"></span><!-- vignettes si le poids total ne dépasse pas la config javascript définie plus bas à 100Mo  -->
     
    				<p style="display:none;" data-upabcicss-result-partial="display:block">- sauvegardé : <span class="UpAbci_backup">0 Mo</span></p><!-- S affichera si une sauvegarde existe en cas d arrêr ou d erreur -->
     
    			 </div>
    		</div>
    	 </fieldset>
    	</form>
    	<p style="margin-top:3em;margin-bottom:3em"><a href="index.html">Index</a></p>
    	</div>
     
    <script type="text/javascript">
    $(function(){
    // Initialisation de la classe javascript (identifiant formulaire, destination ajax, identifiant réponse)
     
    var destination_ajax = "Upload-Ajax-ABCI/Php_Upload/UploadAjaxABCI_Php_Load_Redimensions_optimise.php";
     
    var up = new UploadAjaxABCI("#form_redim<?=$donnee['id_photo']?>",destination_ajax,"#reponse_upload<?=$donnee['id_photo']?>");
     
    // Extensions autorisées
    up.config.filesExtensions = ["jpg","jpeg","png","gif"];
     
    // S affichera si le redimensionnement et l upload sont ok.
    up.info.status.ok = "Upload et redimensionnements OK";
     
    // Message d erreur si problème serveur. Sera complété par le message renvoyé par le serveur pour plus de précision.
    up.info.status.errorServer = "Echec du traitement. ";
     
    // les aperçus demandent pas mal de ressource, vous devriez baisser cette valeur ou supprimer la prévisualisation pour les portables.
    up.config.imgPreviewMaxSizeTotal = 100; // en Mo poids total maximum de toutes les photos. Au delà les vignettes ne seront pas affichées.
     
    up.config.imgPreviewMaxWidth = 100; // en pixels, largeur maximale de l aperçu
    up.config.imgPreviewMaxHeight = 100;// en pixels, hauteur maximale de l aperçu
     
    // Démarrage de la fonction, DOM chargé
    up.Start()});
    </script>
    <?php } ?>
    Tu remarqueras que j'ai ajouté un input name="id_photo_binco" pour identifier ta ligne. Tu pourras récupérer cette valeur côté php en faisant $id_photo_binco= urldecode($_POST['id_photo_binco']);

    Et le tarif c'est de prendre 3 secondes pour cliquer sur le pouce vert dans le lien de téléchargement ici. Cela permet d'indiquer aux visiteurs qu'ils ne perdent pas leur temps en téléchargeant ce module, on peut même le mettre dans une boucle pour faire des trucs improbables (faudra faire des tests sur un serveur distant mais comme déjà dit si tu lance beaucoup d'upload en même temps ça risque de ramer)
    Allez, bonne continuation

  13. #13
    Membre habitué
    Homme Profil pro
    sans emploi
    Inscrit en
    Février 2014
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2014
    Messages : 365
    Points : 131
    Points
    131
    Par défaut
    Merci ABCIWEB,

    J ai apporté les modif ... je veux qu a chaque image uploadée la page se rafraichisse en php pour afficher dans le tableau les images téléchargée ...

    Message d erreur:
    Warning: Cannot modify header information - headers already sent by (output started at C:\wamp\www\cemkay\0-menu.php:40) in C:\wamp\www\cemkay\2_telecharge_fichier_xls.php on line 321
    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
    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
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    <?php
    // Variable de session
    // -------------------
    session_start();
    if (!isset($_SESSION['login']))
    {
    	header ('Location: index.php');
    	exit();
    }
    // session_start(): demarre une nouvelle session ou reprend une session existante
    // $_SESSION: variables de session. Tableau associatif des valeurs stockées dans les sessions, et accessible au script courant
    // header(): envoie un en-tete HTTP ... on redirige vers la page ... ou type de contenu que contient le message
     
    header('Content-type: text/html; charset=UTF-8');
     
    // Include des fichiers PHPExcel
    require 'PHPExcel/Classes/PHPExcel.php';
    require_once 'PHPExcel/Classes/PHPExcel/IOFactory.php';
     
    // Importation classeur XLS dans la table
    // --------------------------------------
    // Connexion MYSQL
    // ---------------
    try{
    $chaine_connexion='mysql:host=localhost;dbname=cemkay';
    $connexion_bdd = new PDO($chaine_connexion, 'root', '', array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
    $connexion_bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    }
    catch(PDOException $e){																		
    $msg = 'ERREUR PDO dans ' . $e->getFile() . ' L.' . $e->getLine() . ' : ' . $e->getMessage();
    exit($msg);
    }
     
    // Si le formulaire a été soumis
    if(isset($_POST['Form_file_Submit']))
    {
    	$erreur = 0;
     
    	// Si un fichier a été téléchargé
    	if (is_uploaded_file($_FILES['fileToUpload']['tmp_name']))
    	// $_FILES: variable de téléchargement de fichier via HTTP
    	// $_FILES['userfile']['name']: Le nom original du fichier, tel que sur la machine du client web.
    	// $_FILES['userfile']['type']: Le type MIME du fichier, si le navigateur a fourni cette information ("image/gif"...).
    	// $_FILES['userfile']['size']: La taille, en octets, du fichier téléchargé.
    	// $_FILES['userfile']['tmp_name']: Le nom temporaire du fichier qui sera chargé sur la machine serveur.
    	// $_FILES['userfile']['error']: Le code d'erreur associé au téléchargement de fichier.
    	{
    		// Si le fichier a une extension xls
    		if (strtolower(pathinfo ($_FILES['fileToUpload']['name'], PATHINFO_EXTENSION)) == 'xls')
    		// strtolower: renvoie une chaîne en minuscules
    		// pathinfo: retourne des informations sur un chemin système
    		// PATHINFO_EXTENSION: option qui retourne l extension
    		{
    			// SUPPRESSION des anciens enregistrements
    			// ---------------------------------------
    			// Connexion MYSQL
    			// Preparer la requete
    			$sql = 'DELETE FROM liste_image';
    			$requete1 = $connexion_bdd ->prepare($sql);
    			//Compiler et executer la requete
    			$requete1->execute();
    			//Clore la requete preparee
    			$requete1 -> closeCursor();
    			$requete1 = NULL;
     
    			// Ouvre le fichier téléchargé et ENREGISTRE les nouveaux enregistrements
    			// ----------------------------------------------------------------------
    			// si une seule feuille de donnees
    			$objPHPExcel = PHPExcel_IOFactory::load("liste_image.xls");
    			$worksheet = $objPHPExcel->setActiveSheetIndex(0);
    			$worksheetTitle     = $worksheet->getTitle();
    			$highestRow         = $worksheet->getHighestRow();
    			$highestColumn      = $worksheet->getHighestColumn();
    			$highestColumnIndex = PHPExcel_Cell::columnIndexFromString($highestColumn);
    			$nrColumns = ord($highestColumn) - 64;
     
    			// si plusieurs feuilles de donnees
    			// $objPHPExcel = PHPExcel_IOFactory::load("liste_image.xls");
    			// foreach ($objPHPExcel->getWorksheetIterator() as $worksheet)
    			// {
    			// 		$worksheetTitle     = $worksheet->getTitle();
    			// 		$highestRow         = $worksheet->getHighestRow();
    			// 		$highestColumn      = $worksheet->getHighestColumn();
    			// 		$highestColumnIndex = PHPExcel_Cell::columnIndexFromString($highestColumn);
    			// 		$nrColumns = ord($highestColumn) - 64;
    			// }
     
    			// requete prepare
    			$stmt = $connexion_bdd->prepare('INSERT INTO liste_image (id_photo,  affichage,  disponibilite,  taille_type,  type,  type_fr,  type_en,  numero,  taille,  format,  nom_1,  nom_2,  ref1,  ref2,  ref3,  intitule,  themes,  code_themes,  rewriting_fr,  rewriting_en,  themes_en,  technique,  technique_en,  hauteur,  largeur,  annee_creation,  serie,  epreuve_artiste,  epreuve_artiste_en,  description,  technique_detail,  slide,  height_bdd,  width_bdd,  nom_image) VALUES (?,  ?,  ?,  ?,  ?,  ?,  ?,  ?,  ?,  ?,  ?,  ?,  ?,  ?,  ?,  ?,  ?,  ?,  ?,  ?,  ?,  ?,  ?,  ?,  ?,  ?,  ?,  ?,  ?,  ?,  ?,  ?,  ?,  ?,  ?)');
    			// insertion de chaque ligne each row
    			for ($row=2; $row<=$highestRow; $row++)
    				{
    					$val=array();
    					for ($col = 0; $col < $highestColumnIndex; ++ $col)
    					{
    								$cell = $worksheet->getCellByColumnAndRow($col, $row);
    								$val[$col] = $cell->getValue();		// remarque: $val[$col] <=> $val[]
    					}
    					  $stmt->execute($val);
    				}
    	   }
     
    	   else
    	   {
    		   $MsgErreur_xls = "<p style='color:red'>Le fichier n est pas un fichier xls.</p>";
    	   }
        }
     
        if($erreur > 0) echo "<p style='color:red'>".$erreur." lignes n'ont pas été insérées car le nombre de champs du xls ne correspond pas au nombre de champs de la bdd.</p>";
    }
     
    // else
    // {
    //       print "Bienvenue " . htmlentities(trim($_SESSION['login'])) . "!<br />";
    //       print "<a href='admin_deconnexion.php'>Déconnexion</a>";
    //       print "<form action='#' method='post' enctype='multipart/form-data'>";
    //       print "<input type='file' name='fileToUpload'>";
    //       print "<input type='submit' value='Upload Image' name='Form_file_Submit'>";
    //       print "</form>";	  
    // }
     
    // fait afficher le contenu de la table pour contrôle si besoin
    // $sql = "SELECT * FROM liste_image";
    // $result = $connexion_bdd->query($sql, PDO::FETCH_OBJ);
    // foreach ($result as $value)
    // echo $value->id_photo.' - '.$value->affichage.' - '.$value->taille_type.' - '.$value->type.'<br>';
     
     
    // UPLOAD D IMAGES Upload-Ajax-ABCI
    // --------------------------------
    // Avec :
    // * dossier Destination_Upload1 a la racine du site pour recevoir les images
    // * dossier Upload-Ajax-ABCI a la racine du site. Il contient:
    //    * dossier Javascript. Il contient les fichiers
    //        * jquery.js
    //        * UploadAjaxABCI.js
    //    * dossier Php_Upload. Il contient les fichiers
    //        * func_RedimImage.php
    //        * UploadAjaxABCI_Php_Load_Redimensions_optimise.php
    //        * fichier UploadAjaxABCIServeur.php
    //    * dossier Upload_Temp
    // Utilise le fichier "Php_Upload/UploadAjaxABCI_Php_Load_Redimensions_optimise.php" comme destination Ajax
    // header('Content-type: text/html; charset=UTF-8');
    $UpAbci_fragmentSize = 4194304;// taille maximale des fragments (doit être inférieur ou égal à la configuration 'upload_max_filesize' du serveur). Les fichiers inférieurs à cette taille n'auront pas de sauvegarde temporaire.
    $UpAbci_uniqidForm = hash("sha256",uniqid(rand(), true));
    // Jeton de formulaire (token);
    $_SESSION['UploadAjaxABCI'][$UpAbci_uniqidForm]['token'] = 1;
    ?>
     
    <!DOCTYPE html> <!--on declare au validator le langage utilisé: html5-->
     
    <html lang="fr">
     
    <?php include("0-head.php"); ?>
     
    <body>
     
    <div class="container">	
     
    <?php include("0-menu.php"); ?>
     
    	<br>
    	<hr>
     
    	<div class="row">
    	<h1>Administration du site</h1>
    		<div class="col-lg-12">
    			Bienvenue <?php echo htmlentities(trim($_SESSION['login'])); ?> <br />
    			<a href="1_admin_deconnexion.php" target="_self" title="Déconnexion">Déconnexion</a>
    			<br />
    			<a href="1_admin_membre.php" target="_self" title="Inscription">Retour à administration du site</a>
    		</div>
    	</div>
    	<br /><br /><br />
    	<div class="row">
    		<div class="col-lg-12">
    			<h4>Télécharger un nouveau fichier .xls (actualiser la bdd)</h4>
    			<form action="#" method="post" enctype="multipart/form-data">
    				<input type="file" name="fileToUpload">
    				<input type="submit" value="Upload Fichier" name="Form_file_Submit">
    			</form>
     
    			<?php if(!empty($MsgErreur_xls)) { ?>
    				<p class="message_erreur_yellow"><?php echo $MsgErreur_xls; ?></p>
    			<?php } ?>
     
    		</div>
    	</div>
    	<div class="row">	
    		<div class="col-lg-12">		
    			<table style="border: 1px solid black">
    				<h4>Liste des enregistrements (associer une photo)</h4>
    				<tr>
    					<td>id_photo</td>
    					<td>type</td>
    					<td>intitule</td>
    					<td>themes</td>
    					<td>nom_image</td>
    					<td>image actuelle</td>
    					<td>telecharge nouvelle image</td>
    				</tr>		
    				<?php
    					// Connexion MYSQL
    					// ---------------
    					try
    					{
    						$chaine_connexion='mysql:host=localhost;dbname=cemkay';
    						$connexion_bdd = new PDO($chaine_connexion, 'root', '', array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
    						$connexion_bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    					}
    					catch(PDOException $e)
    					{																		
    						$msg = 'ERREUR PDO dans ' . $e->getFile() . ' L.' . $e->getLine() . ' : ' . $e->getMessage();
    						exit($msg);
    					}
    					// Update du champs nom_image avec concatenation de plusieurs champs
    					// -----------------------------------------------------------------
    					//Preparer la requete
    					// UPDATE: effectuer des modifications sur des lignes existantes
    					// CONCAT: concaténer les valeur de plusieurs colonnes
    					// LOWER:  transformer tous les caractères d’une chaîne de caractère en minuscules
    					// REPLACE('chaîne', 'rechercher', 'remplacer')
    					$sql1 = "UPDATE liste_image SET nom_image = CONCAT(id_photo, '_', LOWER(type), '_', REPLACE(LOWER(intitule), ' ', '_'))";
    					$requete1 = $connexion_bdd ->prepare($sql1);
    					//Compiler et executer la requete
    					$requete1->execute();
     
    					// Afficher le tableau des enregistrements
    					// -----------------------------------------------------------------
    					//Preparer la requete
    					$sql2 = 'SELECT * FROM liste_image';
    					$requete2 = $connexion_bdd ->prepare($sql2);
    					//Compiler et executer la requete
    					$requete2->execute();
    					//Recuperer toutes les donnees retournees
    					foreach($requete2->fetchAll() as $donnee)
    					{?>
     
    					 <tr>
    							<td><?php echo $donnee['id_photo'] ?></td>
    							<td><?php echo $donnee['type'] ?></td>
    							<td><?php echo $donnee['intitule'] ?></td>
    							<td><?php echo $donnee['themes'] ?></td>
    							<td><?php echo $donnee['nom_image'] ?></td>
    							<td><img src="Destination_Upload1/<?php echo $donnee['nom_image'] ?>___mini.jpeg" alt="<?php echo $donnee['nom_image'] ?>" height="42" width="42"></td>
    							<td>
     
    						<!-- Formulaire d'importation d'image
    						------------------------------------>
    						<div style="margin-top:3em">
    						<form id="form_redim<?=$donnee['id_photo']?>" action="#" method="post">
    						 <fieldset style="border:2px solid #000;border-radius:5px;padding:1em">
    							<legend>Upload</legend>
    							 <input type="file" name="upload_simple" multiple="multiple" />
    							 <input type="hidden" value="<?=$UpAbci_fragmentSize?>" name="UpAbci_fragmentSize" />
    							 <input type="hidden" value="<?=$UpAbci_uniqidForm?>" name="UpAbci_uniqidForm" />
     
    							 <!-- pour identifier la ligne:
    							 récupérer cette valeur côté php (UploadAjaxABCIServeur.pp) en faisant
    							 $nom_image_name_file= urldecode($_POST['nom_image_name_file']);
    							 urldecode: décode une chaîne encodée URL-->
    							 <input type="hidden" value="<?=$donnee['nom_image']?>" name="nom_image_name_file" />
     
    							 <input type="submit" value="Envoyer"/>
     
    							 <!-- Bloc conteneur du retour d informations -->
    							 <div id="reponse_upload<?=$donnee['id_photo']?>">
    								<!--information du fichier que l on affiche uniquement si un fichier est sélectionné, pour éviter la barre de progression graphique vide si soumission du formulaire sans fichier-->
    								 <div class="UpAbci_infosFile" style="display:none;margin-top:1em;clear:both" data-upabcicss-select-file="display:block;">
    									 <hr>
     
    									<span class="UpAbci_stop" style="color:red;cursor:pointer;font-size:0.8em;" data-upabcicss-result="display:none">stop </span>
     
    									<span class="UpAbci_name"></span><!-- nom du fichier -->
     
    									<progress class="UpAbci_progressionG"></progress> <!-- progression graphique -->
    									<span class="UpAbci_status" data-upabcicss-result-ok="color:green;font-weight:bold">en attente</span><!-- status (important sinon pas de retour d information en cas d erreur) -->
    									<span class="UpAbci_imgPreview" style="float:right"></span><!-- vignettes si le poids total ne dépasse pas la config javascript définie plus bas à 100Mo  -->
     
    									<p style="display:none;" data-upabcicss-result-partial="display:block">- sauvegardé : <span class="UpAbci_backup">0 Mo</span></p><!-- S affichera si une sauvegarde existe en cas d arrêr ou d erreur -->
     
    								 </div>
    							</div>
    						 </fieldset>
    						</form>
     
    						</div>
     
    							</td>
    					</tr>
     
    <!-- Script javascript pour upload images
    ----------------------------------------> 
    <script type="text/javascript">
    $(function(){
    // Initialisation de la classe javascript (identifiant formulaire, destination ajax, identifiant réponse)
     
    var destination_ajax = "Upload-Ajax-ABCI/Php_Upload/UploadAjaxABCI_Php_Load_Redimensions_optimise.php";
     
    var up = new UploadAjaxABCI("#form_redim<?=$donnee['id_photo']?>",destination_ajax,"#reponse_upload<?=$donnee['id_photo']?>");
     
    // Extensions autorisées
    up.config.filesExtensions = ["jpg","jpeg","png","gif"];
     
    // S affichera si le redimensionnement et l upload sont ok.
    up.info.status.ok = "Upload et redimensionnements OK";
     
    // Message d erreur si problème serveur. Sera complété par le message renvoyé par le serveur pour plus de précision.
    up.info.status.errorServer = "Echec du traitement. ";
     
    // les aperçus demandent pas mal de ressource, vous devriez baisser cette valeur ou supprimer la prévisualisation pour les portables.
    up.config.imgPreviewMaxSizeTotal = 100; // en Mo poids total maximum de toutes les photos. Au delà les vignettes ne seront pas affichées.
     
    up.config.imgPreviewMaxWidth = 100; // en pixels, largeur maximale de l aperçu
    up.config.imgPreviewMaxHeight = 100;// en pixels, hauteur maximale de l aperçu
     
    // Démarrage de la fonction, DOM chargé
    up.Start()});
     
    </script>
    				<?php ; header("Refresh:0");} ?>
    			</table>
    		</div>
    	</div>			
     
    <!-- Script javascript pour upload images
    ---------------------------------------->
    <script src="Upload-Ajax-ABCI/Javascript/jquery.js"></script>
    <script src="Upload-Ajax-ABCI/Javascript/UploadAjaxABCI.js"></script>	
     
    </body>
    </html>

  14. #14
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 382
    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 382
    Points : 10 410
    Points
    10 410
    Par défaut
    Salut,

    Si tu mets un header de redirection php dans du html, forcément tu auras ce message d'erreur.

    Par ailleurs si tu rafraichis la page à chaque image uploadée, forcément aussi cela va interrompre le téléchargement des images suivantes si d'autres sont en cours...

    Tu veux faire afficher l'image dans la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <img src="Destination_Upload1/<?php echo $donnee['nom_image'] ?>___mini.jpeg" alt="<?php echo $donnee['nom_image'] ?>" height="42" width="42"></td>
    ?

    Et y-a-t-il y a une seule image par ligne ? C'est assez contradictoire puisque dans ton code je vois l'attribut multiple="multiple".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <input type="file" name="upload_simple" multiple="multiple" />

  15. #15
    Membre habitué
    Homme Profil pro
    sans emploi
    Inscrit en
    Février 2014
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2014
    Messages : 365
    Points : 131
    Points
    131
    Par défaut
    Et y-a-t-il y a une seule image par ligne ? C'est assez contradictoire puisque dans ton code je vois l'attribut multiple="multiple".
    J ai opte pour la methode "Upload avec prévisualisation et 3 redimensionnements des images"
    qui permet d obtenir pour une image donnée trois images de taille différentes.

    En fait ce que je veux c est que l upload soit indépendant pour chaque ligne?
    Chaque ligne a son bouton "upload"

    Tu veux faire afficher l'image dans la ligne
    Oui je veux que pour une ligne donnée quand je télécharge une photo,
    l'image apparaisse aussitôt après avoir appuyé sur le bouton "Envoyer" (rafraichissement de la page si possible en php)
    ce qui permet de visualiser les lignes qui ont une image et celles qui n en ont pas

    ACIWEB au final ça a l air de bien fonctionner ... t avais peur que le chargement soit lourd ...

  16. #16
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 382
    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 382
    Points : 10 410
    Points
    10 410
    Par défaut
    Mais la vignette est déjà affichée dans le bloc "UpAbci_imgPreview" de prévisualisation. Si à côté de cette image cela marque ok quand l'image est uploadée, c'est suffisant non ? Tu veux la faire afficher une seconde fois ?

    Sinon sur le principe bien sûr ça fonctionne même dans une boucle. Mais le problème c'est quand tu soumets plusieurs formulaires à la fois. C'est moins performant que d'envoyer les formulaires à la suite. Après ça dépend aussi de ta ligne internet. Evidemment si tu as le câble avec (si mes souvenirs sont bons) entre 5Mb et 10Mb de débit ascendant ça change la donne par rapport à un adsl classique qui lui est limité à 1Mb et même souvent 512kb en ascendant. Dépend aussi de ton serveur distant, et du poids des fichiers.
    Bref il peut y avoir de nombreux goulots d'étranglement qui font ramer un upload et d'autant plus plusieurs simultanés. Et cela n'a rien à voir avec la classe elle même, c'est pareil pour n'importe quel upload ou téléchargement, on est dépendant du matériel et de la ligne utilisée

  17. #17
    Membre habitué
    Homme Profil pro
    sans emploi
    Inscrit en
    Février 2014
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2014
    Messages : 365
    Points : 131
    Points
    131
    Par défaut
    Grand merci ACIWEB

  18. #18
    Membre habitué
    Homme Profil pro
    sans emploi
    Inscrit en
    Février 2014
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2014
    Messages : 365
    Points : 131
    Points
    131
    Par défaut
    ACIWEB

    Je vous sollicite encore une fois,

    Je voudrais que lors de l'importation de l'image, le champs ext_image (extension de l image) de la table liste_image de la base image_site se remplisse.

    Pour se faire j'ai ajouté le code suivant dans le fichier UploadAjaxABCI_Php_Load_Redimensions_optimise.php:
    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
    		// Ajout: ecriture de l extension de l image dans la table liste_image
    		// -------------------------------------------------------------------
    		$id_photo_id_file= urldecode($_POST['id_photo_id_file']);
    					// Update du champs ext_image
    					// --------------------------------------------------	
    					try
    					{
    						$chaine_connexion='mysql:host=localhost;dbname=images_site';
    						$connexion_bdd = new PDO($chaine_connexion, 'root', '', array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
    						$connexion_bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    					}
    					catch(PDOException $e)
    					{																		
    						$msg = 'ERREUR PDO dans ' . $e->getFile() . ' L.' . $e->getLine() . ' : ' . $e->getMessage();
    						exit($msg);
    					}					
    					$sql1 = 'UPDATE liste_image SET ext_image=:ext_image WHERE id_photo=:id_photo';
    					$sql1->bindValue(':ext_image',  $extension_fichier, PDO::PARAM_STR);
    					$sql1->bindValue(':id_photo', $id_photo_id_file);
    					$sql1->execute();
     
    		// ----------------------------------------------------------------
    Ci dessous mon ficher UploadAjaxABCI_Php_Load_Redimensions_optimise.php complet:
    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
    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
    <?php
    /*
    require 'UploadAjaxABCIServeur.php' et 'func_RedimImage.php';
    
    (Gardez bien à l'esprit que ce script sera appelé plusieurs fois pour le traitement du même post, excepté en cas d'upload simple si la taille du fichier est inférieure à la taille d'un fragment ou si aucun fichier n'est joint)
    
    // Exemple de script php d'upload avec redimensionnement d'images. Voir "UploadAjaxABCI_Php_Load_Redimensions.php" pour d'autres informations.
    
    /* Ce script utilise la même fonction de redimensionnement que le script "UploadAjaxABCI_Php_Load_Redimensions.php".
    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 de qualité 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
    // Le '../' permet de remonter d'un niveau dans l'arborescence des fichiers
    /*------------------------------------------------------*/
    $dossier_destination1 = '../Destination_Upload1/';
    $dossier_temporaire = '../Upload_Temp/';
    /*------------------------------------------------------*/
     
    session_start();
     
    header('Content-type: text/html; charset=UTF-8');
     
    require 'UploadAjaxABCIServeur.php';
     
    $up = new UploadAjaxABCIServeur($dossier_destination1, $dossier_temporaire);
     
    // Décommenter la ligne ci-dessous en phase de développement pour faire afficher les erreurs php dans le formulaire.
    /*
    $up->setModeDebug ();
    */
     
    $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->cathErrorServeur($tab_erreurs);
     
    $uniqid_form = $up->getParam("uniqid_form");
     
    if(!(isset($uniqid_form,$_SESSION['UploadAjaxABCI'][$uniqid_form]['token']))) $up->exitStatusErreur("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())
    {
    	$filesExtensions = array('jpg','jpeg','png','gif');
     
    	$nom_fichier_nettoye = $up->getCleanFileName();
     
    	$verif_extension = $up->VerifExtensions($nom_fichier_nettoye,$filesExtensions);
    	if($verif_extension == false) 
    	{
    		$up->exitStatusErreur('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->getTempAdressFileComplete();
    	if($fichier_complet != false)
    	{
    		require 'func_RedimImage.php';
     
     
    		/*Si plusieurs redimensionnements on utilise les troisième et quatrième paramètre de la fonction "func_RedimImage()" 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 = func_RedimImage($L, $H, $dossier_dest, $nom_fichier, $dirname, $basename, $extension_fichier);
     
    			if(!$redim) 
    			{			
    				$up->exitStatusErreur("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->exitStatusErreur("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']);
     
    		// Ajout: ecriture de l extension de l image dans la table liste_image
    		// -------------------------------------------------------------------
    		$id_photo_id_file= urldecode($_POST['id_photo_id_file']);
    					// Update du champs ext_image
    					// --------------------------------------------------	
    					try
    					{
    						$chaine_connexion='mysql:host=localhost;dbname=images_site';
    						$connexion_bdd = new PDO($chaine_connexion, 'root', '', array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
    						$connexion_bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    					}
    					catch(PDOException $e)
    					{																		
    						$msg = 'ERREUR PDO dans ' . $e->getFile() . ' L.' . $e->getLine() . ' : ' . $e->getMessage();
    						exit($msg);
    					}					
    					$sql1 = 'UPDATE liste_image SET ext_image=:ext_image WHERE id_photo=:id_photo';
    					$sql1->bindValue(':ext_image',  $extension_fichier, PDO::PARAM_STR);
    					$sql1->bindValue(':id_photo', $id_photo_id_file);
    					$sql1->execute();
     
    		// ----------------------------------------------------------------						
     
    		$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->getRelativeAddress().$dossier_destination1;
     
     
    		// Si l'on souhaite garder l'image originale on fait une copie vers la destination
    		if (!copy($fichier_complet, $dossier_dest_serveur.$non_fichier.'.'.$extension_fichier)) 
    		{
        		$up->exitStatusErreur("Erreur dans la copie du fichier original.");
    		}
     
    		/* 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;
     
    		// Redimensionnements 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() transfère le fichier temporaire - qui dans cet exemple contient le plus grand redimensionnement - vers son emplacement définitif (retourne true si ok). L'utilisation de cette fonction est indispensable pour terminer l'upload (supprime le cookie et envoie les informations nécessaires au script ajax pour terminer la requête).  
    		$transfert = $up->Transfert($destination_fichier);
     
    		// On défini le chmod (si besoin)
    		if($transfert && !@chmod($destination_fichier,0604))
    		{
    			$up->exitStatusErreur("Echec de la configuration des droits d'accès du fichier");
    		}
    	}
    }
     
     
    // Voir le fichier "UploadAjaxABCI_Php_Load.php" pour des possibilités supplémentaires...
     
     
    $up->exitReponseAjax();
    ?>
    et la page de téléchargement des images:
    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
    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
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    392
    393
    394
    395
    396
    397
    398
    399
    400
    401
    402
    403
    404
    405
    406
    407
    408
    409
    410
    411
    412
    413
    414
    415
    416
    417
    418
    419
    420
    421
    422
    423
    424
    425
    426
    427
    428
    429
    430
    431
    432
    433
    434
    435
    436
    437
    438
    439
    440
    441
    442
    443
    444
    445
    446
    447
    448
    449
    450
    451
    452
    453
    454
    455
    456
    457
    458
    459
    460
    461
    462
    463
    464
    465
    <?php
    // Variable de session
    // -------------------
    session_start();
    if (!isset($_SESSION['login']))
    {
    	header ('Location: index.php');
    	exit();
    }
    // session_start(): demarre une nouvelle session ou reprend une session existante
    // $_SESSION: variables de session. Tableau associatif des valeurs stockées dans les sessions, et accessible au script courant
    // header(): envoie un en-tete HTTP ... on redirige vers la page ... ou type de contenu que contient le message
     
    header('Content-type: text/html; charset=UTF-8');
     
    // Include des fichiers PHPExcel
    require 'PHPExcel/Classes/PHPExcel.php';
    require_once 'PHPExcel/Classes/PHPExcel/IOFactory.php';
     
    // Importation classeur XLS dans la table
    // --------------------------------------
    // Connexion MYSQL
    // ---------------
    try{
    $chaine_connexion='mysql:host=localhost;dbname=images_site';
    $connexion_bdd = new PDO($chaine_connexion, 'root', '', array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
    $connexion_bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    }
    catch(PDOException $e){																		
    $msg = 'ERREUR PDO dans ' . $e->getFile() . ' L.' . $e->getLine() . ' : ' . $e->getMessage();
    exit($msg);
    }
     
    // Si le formulaire a été soumis
    if(isset($_POST['Form_file_Submit']))
    {
    	$erreur = 0;
     
    	// Si un fichier a été téléchargé
    	if (is_uploaded_file($_FILES['fileToUpload']['tmp_name']))
    	// $_FILES: variable de téléchargement de fichier via HTTP
    	// $_FILES['userfile']['name']: Le nom original du fichier, tel que sur la machine du client web.
    	// $_FILES['userfile']['type']: Le type MIME du fichier, si le navigateur a fourni cette information ("image/gif"...).
    	// $_FILES['userfile']['size']: La taille, en octets, du fichier téléchargé.
    	// $_FILES['userfile']['tmp_name']: Le nom temporaire du fichier qui sera chargé sur la machine serveur.
    	// $_FILES['userfile']['error']: Le code d'erreur associé au téléchargement de fichier.
    	{
    		// Si le fichier a une extension xls
    		if (strtolower(pathinfo ($_FILES['fileToUpload']['name'], PATHINFO_EXTENSION)) == 'xls')
    		// strtolower: renvoie une chaîne en minuscules
    		// pathinfo: retourne des informations sur un chemin système
    		// PATHINFO_EXTENSION: option qui retourne l extension
    		{
    			// SUPPRESSION des anciens enregistrements
    			// ---------------------------------------
    			// Connexion MYSQL
    			// Preparer la requete
    			$sql = 'DELETE FROM liste_image';
    			$requete1 = $connexion_bdd ->prepare($sql);
    			//Compiler et executer la requete
    			$requete1->execute();
    			//Clore la requete preparee
    			$requete1 -> closeCursor();
    			$requete1 = NULL;
     
    			// Ouvre le fichier téléchargé et ENREGISTRE les nouveaux enregistrements
    			// ----------------------------------------------------------------------
    			// si une seule feuille de donnees
    			$objPHPExcel = PHPExcel_IOFactory::load("liste_image.xls");
    			$worksheet = $objPHPExcel->setActiveSheetIndex(0);
    			$worksheetTitle     = $worksheet->getTitle();
    			$highestRow         = $worksheet->getHighestRow();
    			$highestColumn      = $worksheet->getHighestColumn();
    			$highestColumnIndex = PHPExcel_Cell::columnIndexFromString($highestColumn);
    			$nrColumns = ord($highestColumn) - 64;
     
    			// si plusieurs feuilles de donnees
    			// $objPHPExcel = PHPExcel_IOFactory::load("liste_image.xls");
    			// foreach ($objPHPExcel->getWorksheetIterator() as $worksheet)
    			// {
    			// 		$worksheetTitle     = $worksheet->getTitle();
    			// 		$highestRow         = $worksheet->getHighestRow();
    			// 		$highestColumn      = $worksheet->getHighestColumn();
    			// 		$highestColumnIndex = PHPExcel_Cell::columnIndexFromString($highestColumn);
    			// 		$nrColumns = ord($highestColumn) - 64;
    			// }
     
    			// requete prepare
    			$stmt = $connexion_bdd->prepare('INSERT INTO liste_image (id_photo,  affichage,  disponibilite,  taille_type,  type,  type_fr,  type_en,  numero,  taille,  format,  nom_1,  nom_2,  ref1,  ref2,  ref3,  intitule,  themes,  code_themes,  rewriting_fr,  rewriting_en,  themes_en,  technique,  technique_en,  hauteur,  largeur,  annee_creation,  serie,  epreuve_artiste,  epreuve_artiste_en,  description,  technique_detail,  slide,  height_bdd,  width_bdd,  nom_image, ext_image) VALUES (?,  ?,  ?,  ?,  ?,  ?,  ?,  ?,  ?,  ?,  ?,  ?,  ?,  ?,  ?,  ?,  ?,  ?,  ?,  ?,  ?,  ?,  ?,  ?,  ?,  ?,  ?,  ?,  ?,  ?,  ?,  ?,  ?,  ?,  ?,  ?)');
    			// insertion de chaque ligne each row
    			for ($row=2; $row<=$highestRow; $row++)
    				{
    					$val=array();
    					for ($col = 0; $col < $highestColumnIndex; ++ $col)
    					{
    								$cell = $worksheet->getCellByColumnAndRow($col, $row);
    								$val[$col] = $cell->getValue();		// remarque: $val[$col] <=> $val[]
    					}
    					  $stmt->execute($val);
    				}
    	   }
     
    	   else
    	   {
    		   $MsgErreur_xls = "<p style='color:red'>Le fichier n est pas un fichier xls.</p>";
    	   }
        }
     
        if($erreur > 0) echo "<p style='color:red'>".$erreur." lignes n'ont pas été insérées car le nombre de champs du xls ne correspond pas au nombre de champs de la bdd.</p>";
    }
     
    // else
    // {
    //       print "Bienvenue " . htmlentities(trim($_SESSION['login'])) . "!<br />";
    //       print "<a href='admin_deconnexion.php'>Déconnexion</a>";
    //       print "<form action='#' method='post' enctype='multipart/form-data'>";
    //       print "<input type='file' name='fileToUpload'>";
    //       print "<input type='submit' value='Upload Image' name='Form_file_Submit'>";
    //       print "</form>";	  
    // }
     
    // fait afficher le contenu de la table pour contrôle si besoin
    // $sql = "SELECT * FROM liste_image";
    // $result = $connexion_bdd->query($sql, PDO::FETCH_OBJ);
    // foreach ($result as $value)
    // echo $value->id_photo.' - '.$value->affichage.' - '.$value->taille_type.' - '.$value->type.'<br>';
     
     
    // UPLOAD D IMAGES Upload-Ajax-ABCI
    // --------------------------------
    // Si le formulaire a été soumis
    // Avec :
    // * dossier Destination_Upload1 a la racine du site pour recevoir les images
    // * dossier Upload-Ajax-ABCI a la racine du site. Il contient:
    //    * dossier Javascript. Il contient les fichiers
    //        * jquery.js
    //        * UploadAjaxABCI.js
    //    * dossier Php_Upload. Il contient les fichiers
    //        * func_RedimImage.php
    //        * UploadAjaxABCI_Php_Load_Redimensions_optimise.php
    //        * fichier UploadAjaxABCIServeur.php
    //    * dossier Upload_Temp
    // Utilise le fichier "Php_Upload/UploadAjaxABCI_Php_Load_Redimensions_optimise.php" comme destination Ajax
    // header('Content-type: text/html; charset=UTF-8');
    $UpAbci_fragmentSize = 4194304;// taille maximale des fragments (doit être inférieur ou égal à la configuration 'upload_max_filesize' du serveur). Les fichiers inférieurs à cette taille n'auront pas de sauvegarde temporaire.
    $UpAbci_uniqidForm = hash("sha256",uniqid(rand(), true));
    // Jeton de formulaire (token);
    $_SESSION['UploadAjaxABCI'][$UpAbci_uniqidForm]['token'] = 1;
    ?>
     
    <?php
    // ---------------------
    // REPERAGE PAGE EN COURS
    // ---------------------
    $page_en_cours=basename(__FILE__);
     
    // ---------------------
    // IP du visiteur
    	$ipvisiteur = $_SERVER["REMOTE_ADDR"];			// $_SERVER: Variables de serveur et d'exécution. REMOTE_ADDR: adresse IP du client qui demande la page courante
    // ---------------------
    // Format d'affichage de la date (au choix)
    	//$date		= date ( "d/m/Y H:i:s" ); // avec les heures:minutes:secondes
    	$date		= date ( "d/m/Y à H:i" );
    	//$date		= date ( "d/m/Y" );
    // ---------------------
    ?>
     
    <!DOCTYPE html> <!--on declare au validator le langage utilisé: html5-->
     
    <html lang="fr">
     
    <?php include("0-head.php"); ?>
     
    <body>
     
    <div class="container">	
     
    <?php include("0-menu.php"); ?>
     
    	<br>
    	<hr>
     
    	<div class="row">
    	<h1>Administration du site</h1>
    		<div class="col-lg-12">
    			Bienvenue <?php echo htmlentities(trim($_SESSION['login'])); ?> <br />
    			<a href="15-admin-deconnexion.php" target="_self" title="Déconnexion">Déconnexion</a>
    			<br />
    			<a href="15-admin-membre.php" target="_self" title="Inscription">Retour à administration du site</a>
    		</div>
    	</div>
    	<br /><br /><br />
    	<div class="row">
    		<div class="col-lg-12">
    			<h4>Télécharger un nouveau fichier .xls (actualiser la bdd)</h4>
    			<form action="#" method="post" enctype="multipart/form-data">
    				<input type="file" name="fileToUpload">
    				<input type="submit" value="Upload Fichier" name="Form_file_Submit">
    			</form>
     
    			<?php if(!empty($MsgErreur_xls)) { ?>
    				<p class="message_erreur_yellow"><?php echo $MsgErreur_xls; ?></p>
    			<?php } ?>
     
    		</div>
    	</div>
    	<div class="row">	
    		<div class="col-lg-12">		
    			<table style="border: 1px solid black">
    				<h4>Liste des enregistrements (associer une photo)</h4>
    				<tr>
    					<td>id_photo</td>
    					<td>type</td>
    					<td>intitule</td>
    					<td>themes</td>
    					<td>nom_image</td>
    					<td>image actuelle</td>
    					<td>telecharge nouvelle image</td>
    				</tr>		
    				<?php
    					// Connexion MYSQL
    					// ---------------
    					try
    					{
    						$chaine_connexion='mysql:host=localhost;dbname=images_site';
    						$connexion_bdd = new PDO($chaine_connexion, 'root', '', array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
    						$connexion_bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    					}
    					catch(PDOException $e)
    					{																		
    						$msg = 'ERREUR PDO dans ' . $e->getFile() . ' L.' . $e->getLine() . ' : ' . $e->getMessage();
    						exit($msg);
    					}
     
    					// Update du champs nom_image avec SELECT puis UPDATE
    					// --------------------------------------------------				
    					$sql1 = 'SELECT id_photo, type, intitule FROM liste_image';
    					try {
    							$sql1 = $connexion_bdd->prepare($sql1);
    							$sql1->execute();
     
    							/* Lie par les numéros de colonnes */
    							$sql1->bindColumn(1, $id_photo);
    							$sql1->bindColumn(2, $type);
    							$sql1->bindColumn(3, $intitule);
     
     
    							/* Lie par les noms de colonnes */
    							$sth_update = $connexion_bdd->prepare("UPDATE liste_image SET nom_image=:nom_image WHERE id_photo=:id_photo");
    							while ($row = $sql1->fetch(PDO::FETCH_BOUND)) {
     
    									/* Rechercher remplacer les caracteres */		
    									$cible = array(
    									' ', '  ', '   ', '-', "'", '(', ')',
    									'À', 'Á', 'Â', 'Ã', 'Ä', 'Å', 'Æ', 'Ă', 'Ą',
    									'Ç', 'Ć', 'Č', 'Œ',
    									'Ď', 'Đ',
    									'à', 'á', 'â', 'ã', 'ä', 'å', 'æ', 'ă', 'ą',
    									'ç', 'ć', 'č', 'œ',
    									'ď', 'đ',
    									'È', 'É', 'Ê', 'Ë', 'Ę', 'Ě',
    									'Ğ',
    									'Ì', 'Í', 'Î', 'Ï', 'İ',
    									'Ĺ', 'Ľ', 'Ł',
    									'è', 'é', 'ê', 'ë', 'ę', 'ě',
    									'ğ',
    									'ì', 'í', 'î', 'ï', 'ı',
    									'ĺ', 'ľ', 'ł',
    									'Ñ', 'Ń', 'Ň',
    									'Ò', 'Ó', 'Ô', 'Õ', 'Ö', 'Ø', 'Ő',
    									'Ŕ', 'Ř',
    									'Ś', 'Ş', 'Š',
    									'ñ', 'ń', 'ň',
    									'ò', 'ó', 'ô', 'ö', 'ø', 'ő',
    									'ŕ', 'ř',
    									'ś', 'ş', 'š',
    									'Ţ', 'Ť',
    									'Ù', 'Ú', 'Û', 'Ų', 'Ü', 'Ů', 'Ű',
    									'Ý', 'ß',
    									'Ź', 'Ż', 'Ž',
    									'ţ', 'ť',
    									'ù', 'ú', 'û', 'ų', 'ü', 'ů', 'ű',
    									'ý', 'ÿ',
    									'ź', 'ż', 'ž',
    									'А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ё', 'Ж', 'З', 'И', 'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р',
    									'а', 'б', 'в', 'г', 'д', 'е', 'ё', 'ж', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'р',
    									'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Ъ', 'Ы', 'Ь', 'Э', 'Ю', 'Я',
    									'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', 'ъ', 'ы', 'ь', 'э', 'ю', 'я'
    									);
     
    									$rempl = array(
    									'_', '_', '_', '_', "_", '_', '_',
    									'A', 'A', 'A', 'A', 'A', 'A', 'AE', 'A', 'A',
    									'C', 'C', 'C', 'CE',
    									'D', 'D',
    									'a', 'a', 'a', 'a', 'a', 'a', 'ae', 'a', 'a',
    									'c', 'c', 'c', 'ce',
    									'd', 'd',
    									'E', 'E', 'E', 'E', 'E', 'E',
    									'G',
    									'I', 'I', 'I', 'I', 'I',
    									'L', 'L', 'L',
    									'e', 'e', 'e', 'e', 'e', 'e',
    									'g',
    									'i', 'i', 'i', 'i', 'i',
    									'l', 'l', 'l',
    									'N', 'N', 'N',
    									'O', 'O', 'O', 'O', 'O', 'O', 'O',
    									'R', 'R',
    									'S', 'S', 'S',
    									'n', 'n', 'n',
    									'o', 'o', 'o', 'o', 'o', 'o',
    									'r', 'r',
    									's', 's', 's',
    									'T', 'T',
    									'U', 'U', 'U', 'U', 'U', 'U', 'U',
    									'Y', 'Y',
    									'Z', 'Z', 'Z',
    									't', 't',
    									'u', 'u', 'u', 'u', 'u', 'u', 'u',
    									'y', 'y',
    									'z', 'z', 'z',
    									'A', 'B', 'B', 'r', 'A', 'E', 'E', 'X', '3', 'N', 'N', 'K', 'N', 'M', 'H', 'O', 'N', 'P',
    									'a', 'b', 'b', 'r', 'a', 'e', 'e', 'x', '3', 'n', 'n', 'k', 'n', 'm', 'h', 'o', 'p',
    									'C', 'T', 'Y', 'O', 'X', 'U', 'u', 'W', 'W', 'b', 'b', 'b', 'E', 'O', 'R',
    									'c', 't', 'y', 'o', 'x', 'u', 'u', 'w', 'w', 'b', 'b', 'b', 'e', 'o', 'r'
    									);
     
    									$intitule = mb_strtolower($intitule,'UTF-8');
    									$intitule = str_replace($cible, $rempl, $intitule);// préserve le maximum de caractères utiles
    									$intitule = str_replace("__", "_", $intitule);
     
    								$sth_update->bindValue(':nom_image',  $id_photo . '_' . $type . '_' . $intitule, PDO::PARAM_STR);
    								$sth_update->bindValue(':id_photo', $id_photo);
    								$sth_update->execute();
    							}
    						}
     
    					catch (PDOException $e) {
    					print $e->getMessage();
    					}				
     
    					// Update du champs nom_image avec concatenation de plusieurs champs
    					// -----------------------------------------------------------------
    					// Preparer la requete
    					// UPDATE: effectuer des modifications sur des lignes existantes
    					// CONCAT: concaténer les valeur de plusieurs colonnes
    					// LOWER:  transformer tous les caractères d’une chaîne de caractère en minuscules
    					// REPLACE('chaîne', 'rechercher', 'remplacer')
    					// $sql1 = "UPDATE liste_image SET nom_image = CONCAT(id_photo, '_', LOWER(type), '_', REPLACE(LOWER(intitule), ' ', '_'))";
    					// $requete1 = $connexion_bdd ->prepare($sql1);
    					// Compiler et executer la requete
    					// $requete1->execute();
     
    					// Afficher le tableau des enregistrements
    					// -----------------------------------------------------------------
    					//Preparer la requete
    					$sql2 = 'SELECT * FROM liste_image';
    					$requete2 = $connexion_bdd ->prepare($sql2);
    					//Compiler et executer la requete
    					$requete2->execute();
    					//Recuperer toutes les donnees retournees
    					foreach($requete2->fetchAll() as $donnee)
    					{?>
     
    					 <tr>
    							<td><?php echo $donnee['id_photo'] ?></td>
    							<td><?php echo $donnee['type'] ?></td>
    							<td><?php echo $donnee['intitule'] ?></td>
    							<td><?php echo $donnee['themes'] ?></td>
    							<td><?php echo $donnee['nom_image'] ?></td>
    							<td>
    							<img src="../Upload-Ajax-ABCI/Destination_Upload1/<?php echo $donnee['nom_image'] ?>_mini.jpeg" alt="<?php echo $donnee['nom_image'] ?>" height="42" width="42"></td>
    							<td>
    							<img src="../Upload-Ajax-ABCI/Destination_Upload1/18_gravure_le_berger_et_son_troupeau_mini.jpg" height="42" width="42">
    						<!-- Formulaire d'importation d'image
    						------------------------------------>
    						<div style="margin-top:3em">
    						<form id="form_redim<?=$donnee['id_photo']?>" action="#" method="post">
    						 <fieldset style="border:2px solid #000;border-radius:5px;padding:1em">
    							<legend>Upload</legend>
    							 <input type="file" name="upload_simple" multiple="multiple" />
    							 <input type="hidden" value="<?=$UpAbci_fragmentSize?>" name="UpAbci_fragmentSize" />
    							 <input type="hidden" value="<?=$UpAbci_uniqidForm?>" name="UpAbci_uniqidForm" />
     
    							 <!-- pour identifier la ligne:
    							 récupérer cette valeur côté php (UploadAjaxABCIServeur.pp) en faisant
    							 $nom_image_name_file= urldecode($_POST['nom_image_name_file']);
    							 urldecode: décode une chaîne encodée URL-->
    							 <input type="hidden" value="<?=$donnee['nom_image']?>" name="nom_image_name_file" />
    							 <!-- pour identifier la ligne:
    							 récupérer cette valeur côté php (UploadAjaxABCI_Php_Load_Redimensions_optimise.pp) en faisant
    							 $id_photo_id_file= urldecode($_POST['id_photo_id_file']);
    							 urldecode: décode une chaîne encodée URL-->							 
    							 <input type="hidden" value="<?=$donnee['id_photo']?>" name="id_photo_id_file" />
     
    							 <input type="submit" value="Envoyer"/>
     
    							 <!-- Bloc conteneur du retour d informations -->
    							 <div id="reponse_upload<?=$donnee['id_photo']?>">
    								<!--information du fichier que l on affiche uniquement si un fichier est sélectionné, pour éviter la barre de progression graphique vide si soumission du formulaire sans fichier-->
    								 <div class="UpAbci_infosFile" style="display:none;margin-top:1em;clear:both" data-upabcicss-select-file="display:block;">
    									 <hr>
     
    									<span class="UpAbci_stop" style="color:red;cursor:pointer;font-size:0.8em;" data-upabcicss-result="display:none">stop </span>
     
    									<span class="UpAbci_name"></span><!-- nom du fichier -->
     
    									<progress class="UpAbci_progressionG"></progress> <!-- progression graphique -->
    									<span class="UpAbci_status" data-upabcicss-result-ok="color:green;font-weight:bold">en attente</span><!-- status (important sinon pas de retour d information en cas d erreur) -->
    									<span class="UpAbci_imgPreview" style="float:right"></span><!-- vignettes si le poids total ne dépasse pas la config javascript définie plus bas à 100Mo  -->
     
    									<p style="display:none;" data-upabcicss-result-partial="display:block">- sauvegardé : <span class="UpAbci_backup">0 Mo</span></p><!-- S affichera si une sauvegarde existe en cas d arrêr ou d erreur -->
     
    								 </div>
    							</div>
    						 </fieldset>
    						</form>
     
    						</div>
     
    							</td>
    					</tr>
     
    <!-- Script javascript pour upload images
    ----------------------------------------> 
    <script type="text/javascript">
    $(function(){
    // Initialisation de la classe javascript (identifiant formulaire, destination ajax, identifiant réponse)
     
    var destination_ajax = "Upload-Ajax-ABCI/Php_Upload/UploadAjaxABCI_Php_Load_Redimensions_optimise.php";
     
    var up = new UploadAjaxABCI("#form_redim<?=$donnee['id_photo']?>",destination_ajax,"#reponse_upload<?=$donnee['id_photo']?>");
     
    // Extensions autorisées
    up.config.filesExtensions = ["jpg","jpeg","png","gif"];
     
    // S affichera si le redimensionnement et l upload sont ok.
    up.info.status.ok = "Upload et redimensionnements OK";
     
    // Message d erreur si problème serveur. Sera complété par le message renvoyé par le serveur pour plus de précision.
    up.info.status.errorServer = "Echec du traitement. ";
     
    // les aperçus demandent pas mal de ressource, vous devriez baisser cette valeur ou supprimer la prévisualisation pour les portables.
    up.config.imgPreviewMaxSizeTotal = 100; // en Mo poids total maximum de toutes les photos. Au delà les vignettes ne seront pas affichées.
     
    up.config.imgPreviewMaxWidth = 100; // en pixels, largeur maximale de l aperçu
    up.config.imgPreviewMaxHeight = 100;// en pixels, hauteur maximale de l aperçu
     
    // Démarrage de la fonction, DOM chargé
    up.Start()});
     
    </script>
    				<?php ;} ?>
    			</table>
    		</div>
    	</div>			
     
    <!-- Script javascript pour upload images
    ---------------------------------------->
    <script src="Upload-Ajax-ABCI/Javascript/jquery.js"></script>
    <script src="Upload-Ajax-ABCI/Javascript/UploadAjaxABCI.js"></script>	
     
    </body>
    </html>
    Le téléchageme

  19. #19
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 382
    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 382
    Points : 10 410
    Points
    10 410
    Par défaut
    Salut,

    Dans le fichier "UploadAjaxABCI_Php_Load_Redimensions_optimise.php" il ne faut pas utiliser d'exit() basique, comme par exemple exit($msg); car cela termine le script sans renvoyer de message dans le formulaire donc c'est plus difficile à débuguer (cela dit tu devrais quand même voir la réponse dans l'onglet réseau->Réponse de la console javascript).

    Mais pour faire plus simple autant renvoyer un message dans le formulaire donc utilises $up->exitStatusErreur($msg);. A noter que "exitStatusErreur" qui permet donc de sortir du script et d'envoyer un message dans le formulaire peut être utilisé pour un débugage facile puisque tu peux le mettre à différents endroits de ton script pour voir ce qui se passe.

    Aussi il faut mettre tout ton code sql dans le bloc try/catch pour intercepter non seulement les erreurs de connexion mais aussi les erreurs de la requête et donc
    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
    try
    {
           $chaine_connexion='mysql:host=localhost;dbname=images_site';
    	$connexion_bdd = new PDO($chaine_connexion, 'root', '', array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
    	$connexion_bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
     
            $sql1 = 'UPDATE liste_image SET ext_image=:ext_image WHERE id_photo=:id_photo';
    	$sql1->bindValue(':ext_image',  $extension_fichier, PDO::PARAM_STR);
    	$sql1->bindValue(':id_photo', $id_photo_id_file);
    	$sql1->execute();
    }
    catch(PDOException $e)
    {																		
    	$msg = 'ERREUR PDO dans ' . $e->getFile() . ' L.' . $e->getLine() . ' : ' . $e->getMessage();
    	$up->exitStatusErreur($msg);
    }
    Je sais pas ce que ça va te retourner comme erreur mais tu peux essayer pour voir si la gestion des erreurs fonctionne. En fait tu as oublié d'utiliser la méthode "prepare" dans ta requête. Je te laisse corriger maintenant que tu as les outils

    A noter :
    - si la requête est écrite loin de la connexion dans ta page, il faut faire deux blocs try/catch, un pour la connexion et un pour la requête.
    - en phase de production (quand tout est ok) il faudra remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $msg = 'ERREUR PDO dans ' . $e->getFile() . ' L.' . $e->getLine() . ' : ' . $e->getMessage();
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $msg = 'Erreur dans la requête';
    car des informations précises telles que l'erreur pdo complète que tu affiche, pourraient renseigner d'éventuels pirates. Autant leur donner des informations vagues dont ils ne pourront rien tirer


    EDIT En regardant ton code en entier je viens de me rendre compte qu'il y a un truc pas tout à fait logique. Normalement on fait la requête sql après avoir vérifié que les fichiers ont été téléchargés correctement dans leur emplacement définitif.
    Donc à la place du code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    // On défini le chmod (si besoin)
    if($transfert && !@chmod($destination_fichier,0604))
    {
    	$up->exitStatusErreur("Echec de la configuration des droits d'accès du fichier");
    }
    Tu pourrais faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // On défini le chmod (si besoin)
    if($transfert)
    {
        if(!@chmod($destination_fichier,0604))
       {
    	$up->exitStatusErreur("Echec de la configuration des droits d'accès du fichier");
       }
     
        // Ta requête d'insertion bdd ici 
        //...
    }
    A toi de voir mais cela me semble plus logique.

  20. #20
    Membre habitué
    Homme Profil pro
    sans emploi
    Inscrit en
    Février 2014
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2014
    Messages : 365
    Points : 131
    Points
    131
    Par défaut
    merci ACIWEB ça marche

    UploadAjaxABCI_Php_Load_Redimensions_optimise.php:
    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
    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
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    392
    393
    394
    395
    396
    397
    398
    399
    400
    401
    402
    403
    404
    405
    406
    407
    408
    409
    410
    411
    412
    413
    414
    415
    416
    417
    418
    419
    420
    421
    422
    423
    424
    425
    426
    427
    428
    429
    430
    431
    432
    433
    434
    435
    436
    437
    438
    439
    440
    441
    442
    443
    444
    445
    446
    447
    448
    449
    450
    451
    452
    453
    454
    455
    456
    457
    458
    459
    460
    461
    462
    463
    464
    465
    466
    467
    468
    469
    470
    471
    472
    473
    474
    475
    476
    477
    478
    479
    480
    481
    482
    483
    484
    485
    486
    487
    488
    489
    490
    491
    492
    493
    494
    495
    496
    497
    498
    499
    500
    501
    502
    503
    504
    505
    506
    507
    508
    509
    510
    511
    512
    513
    514
    515
    516
    517
    518
    519
    520
    521
    522
    523
    524
    525
    526
    527
    528
    529
    530
    531
    532
    533
    534
    535
    536
    537
    538
    539
    540
    541
    542
    543
    544
    545
    546
    547
    548
    549
    550
    551
    552
    553
    554
    555
    556
    557
    558
    559
    560
    561
    562
    563
    564
    565
    566
    567
    568
    569
    570
    571
    572
    573
    574
    575
    576
    577
    578
    579
    580
    581
    582
    583
    584
    585
    586
    587
    588
    589
    590
    591
    592
    593
    594
    595
    596
    597
    598
    599
    600
    601
    602
    603
    604
    605
    606
    607
    608
    609
    610
    611
    612
    613
    614
    615
    616
    617
    618
    619
    620
    621
    622
    623
    624
    625
    626
    627
    628
    629
    630
    631
    632
    633
    634
    635
    636
    637
    638
    639
    640
    641
    642
    643
    644
    645
    646
    647
    648
    649
    650
    651
    652
    653
    654
    655
    656
    657
    658
    659
    660
    661
    662
    663
    664
    665
    666
    667
    668
    669
    670
    671
    672
    673
    674
    675
    676
    677
    678
    679
    680
    681
    682
    683
    684
    685
    686
    687
    688
    689
    690
    691
    692
    693
    694
    695
    696
    697
    698
    699
    700
    701
    702
    703
    704
    705
    706
    707
    708
    709
    710
    711
    712
    713
    714
    715
    716
    717
    718
    719
    720
    721
    722
    723
    724
    725
    726
    727
    728
    729
    730
    731
    732
    733
    734
    735
    736
    737
    738
    739
    740
    741
    742
    743
    744
    745
    746
    747
    748
    749
    750
    751
    752
    753
    754
    755
    756
    757
    758
    759
    760
    761
    762
    763
    764
    765
    766
    767
    768
    769
    770
    771
    772
    773
    774
    775
    776
    777
    778
    779
    780
    781
    782
    783
    784
    785
    786
    787
    788
    789
    790
    791
    792
    793
    794
    795
    796
    797
    798
    799
    800
    801
    802
    803
    804
    <?php 
    error_reporting(E_ALL);
    ini_set('display_errors', 0);
     
    // maximise les possibilités de reprise d'upload en cas d'arrêt intempestif
    ignore_user_abort(true);
     
     
    class UploadAjaxABCIServeur 
    {
    	private $version = '4.5';
    	/* - IMPORTANT : Vous pouvez modifier les valeurs de $this->reponse_upload['erreur'] (bien qu'elles aient très peu de chances d'apparaître si les paramètres sont correctement configurés) 
    	mais PAS les valeurs de $this->reponse_upload['resultat'] qui sont des commandes ajax et qui de toutes façons n'apparaîtront jamais dans la réponse html.
    	
    	- Si vous étendez cette classe et que vous surchargez la fonction "Transfert()", faire attention de supprimer le cookie identifiant le fichier en cas de succès, 
    	ainsi que d'attribuer la valeur "upload_ok" à la variable $this->reponse_upload['resultat'] afin de permettre au script javascript de se poursuivre correctement.
    	*/
     
     
    	//  --------------- Gestion des erreurs fatales ----------------------
     
    	//cf mode d'emploi, chapître CONFIGURATION DU SCRIPT PHP D'UPLOAD
     
    	/* Les messages d'erreurs seront concaténés au message défini dans la classe javascript avec "info.status.erreur".
    	
    	- Si aucune des deux fonctions "cathErrorServeur()" ou "setModeDebug()" n'est utilisée, les erreurs fatales ne seront pas transmises et seul le message javascript s'affichera.
    	
    	- La fonction "cathErrorServeur($tableau)" demande un tableau en paramètre et permet de personnaliser le retour des erreurs fatales. L'index des valeurs est constitué par une suite de mots génériques renvoyés par l'erreur du serveur, 
    	et les valeurs sont constituées soit du message personnalisé à afficher, soit d'un tableau constitué du message personnalisé comme premier élément et de la valeur "true" (ou d'une valeur non nulle) 
    	comme second élément pour indiquer de supprimer le fichier temporaire et l'éventuel cookie du fichier. Exemple :
    
    	$tab_erreurs = array();
    	
    	$tab_erreurs['Allowed memory size'] = array("Mémoire insuffisante, le fichier est trop gros pour être redimensionné.",true); // le cookie et le fichier de sauvegarde seront supprimés
    	
    	$tab_erreurs['Maximum execution time'] = "Le temps d'exécution maximum du script est dépassé, rechargez votre image et réessayez !"; // le cookie et le fichier de sauvegarde seront préservés
    
    	$up->cathErrorServeur($tab_erreurs);
    
    	Voir le mode d'emploi pour plus d'explications. 
    	*/
     
    	public function cathErrorServeur ($array_erreur)
    	{
    		is_array($array_erreur) && count($array_erreur) > 0 ? $this->config_erreur_serveur = $array_erreur : '';
    	}
     
     
    	// Fonction à utiliser juste après l'initialisation de la classe pour retourner les erreurs fatales non attrapées par la fonction "cathErrorServeur()" précédente. A n'utiliser qu'en phase de développement.
    	public function setModeDebug ()
    	{
    		ini_set('display_errors', 1);
    		$this->mode_debug = true;
    	}
     
     
    	/*  --------------- Récupération des paramètres de la requête Ajax ----------------------
    	
    	cf mode d'emploi, chapître CONFIGURATION DU SCRIPT PHP D'UPLOAD
    	
    	Vous pourrez récupérer les valeurs des champs input éventuellement ajoutés dans le formulaire avec la fonction php "urldecode"*:
    
    	$ma_variable = isset($_POST['ma_variable'])*? urldecode($_POST['ma_variable'])*: null;
    	
    	
    	Récupération des paramètres spécifiques de la requête Ajax 
    	Des paramètres spécifiques à la classe javascript peuvent être récupérés en complément :
    	
    	public $UpAbci_form est un tableau de données spécifique à la classe. Il est renseigné dans tous les cas, excepté pour la requête complémentaire de confirmation de fin de traitement du formulaire qui est envoyée 
    	si et uniquement si l'option de configuration javascript  "config.queryFormEnd" = true. Dans ce cas et uniquement pour cette requête additionnelle, le tableau sera vide et vous pourrez récupérer les informations depuis "public $UpAbci_formEnd" évoqué plus bas.
    	
    	Liste des index renseignés* :
    	
    	Dans tous les cas :
    		- id_form
    		- uniqid_form
    		- iteration_form 	nombre d'itérations de la requête ajax pour le formulaire	(remise à zéro pour chaque nouvelle soumission du formulaire)
    	
    	
    	Si un fichier est joint au formulaire :
    		- input_name		nom de l'input de type file
    		- uniqid_file
    		- cook_name
    		- name
    		- size
    		- type
    		- lastModified
    		- qte_save		quantité sauvegardée en continu
    		- qte_upload
    		- result *		"ok_done", "backup_done", "error_done", "backup_fail", 	"error_fail", ou "0_0" 
    						préfixe = état du fichier, suffixe = état de la requête.
    		- time_start
    		- time_end
    		- iteration 	nombre d'itérations de la requête ajax pour le fichier
    	
    	* A noter que "result" est le résultat final renseigné en javascript au retour de la requête ajax. Sa valeur sera donc toujours 0_0 côté serveur excepté si vous configurez l'option config.queryFormEnd = true 
    	pour envoyer une requête additionnelle en fin de traitement du formulaire.
    			
    	Suivant le contexte, la requête ajax envoie d'autres variables  :
    	
    		
    	- public $UpAbci_formEnd 	Uniquement disponible à la fin du traitement du formulaire si l'option de 	
    								configuration javascript "config.queryFormEnd = true". 
    								Retourne un tableau de tableaux d'informations (1 pour chaque fichier)
    								avec le même contenu que "$UpAbci_form" cité plus haut. 
    								Si aucun fichier n'est joint, le tableau  renverra seulement les trois index "id_form", 
    								"uniqid_form" et  "iteration_form".
    								Si l'option javascript n'a pas été configurée ou si ce n'est pas la fin du 	
    								traitement du formulaire $UpAbci_formEnd retourne un tableau vide.
    	
    	protected $UpAbci_blobSlice   	renvoie "true" si le fichier est en plusieurs morceaux
    			
    	protected $UpAbci_fileEnd 		renvoie "true" si c'est la fin du fichier (dernière partie).
    			
    	protected $UpAbci_fragment 		renvoie le fragment de ficher, ou la valeur 1 si une sauvegarde complète est trouvée 
    									lors de la sélection du fichier.
    	
    	
    	La méthode getParam($index) retourne les valeurs du tableau "$UpAbci_form" sinon éventuellement les valeurs de "$UpAbci_formEnd[0]" si  $index = "id_form" ou  $index = "uniqid_form"  ou $index = "iteration_form" (pour être pratique).
    	
    	Exemple*:
    	$name = $up->getParam('name');  // retourne le nom du fichier
    	(retourne false si l'index n'existe pas)
    	*/
     
    	public function getParam ($index)
    	{
    		if(isset($this->UpAbci_form[$index]))
    		{
    			return $this->UpAbci_form[$index];
    		}
    		else if(isset($this->UpAbci_formEnd[0][$index]))
    		{
    			switch ($index)
    			{
    				case 'id_form' :
    				case 'uniqid_form' :
    				case 'iteration_form' : return $this->UpAbci_formEnd[0][$index];break;
    			} 
    		}
    		return false;
    	}
     
     
    	/* 
    	getFileEnd() retourne true si c'est la fin du fichier sinon false. Retourne indéfini si aucun fragment de fichier n'est joint dans la requête. 
    	A NOTER que cette fonction retourne la valeur $UpAbci_fileEnd (cité plus haut) envoyée par javascript avant tout traitement du fichier par le serveur. Utilisez plutôt la fonction "getTempAdressFileComplete()" après la fonction "Upload()" pour avoir confirmation que le fichier est correctement enregistré dans le dossier temporaire du serveur ou "getTransfertOk()" après la fonction "Transfert ()" pour avoir confirmation que le fichier est transféré correctement dans son emplacement définitif.
    	*/
    	public function getFileEnd()
    	{
    		return $this->UpAbci_fileEnd;
    	}
     
     
    	public function saveAll ($value = true)
    	{// A utiliser impérativement AVANT la fonction Upload. Cette fonction permet d'utiliser le répertoire temporaire pour stocker tous les fichiers y compris ceux dont la taille est inférieure à la taille des fragemnts. 
    		$this->save_all = $value;
    	}
     
     
    	public function getFragment ()
    	{// retourne true si un fichier est joint dans la requête (ou si une sauvegarde complète a été trouvée pour le fichier).
    		return isset($this->UpAbci_fragment);
    	}
     
     
    	public function getFragmentSize ()
    	{// retourne la taille du fragment. NE PAS UTILISER pour tester la présence d'un fragment car si une sauvergarde complète est trouvée cette valeur sera indéfinie donc égale à zéro. Seule l'utilisation de getFragment() doit être utilisée pour tester la présence d'un fichier ou d'un fragment joint au post du formulaire.
    		return isset($this->UpAbci_fragment['size']) ? $this->UpAbci_fragment['size'] : 0;
    	}
     
     
    	public function getCleanFileName ()
    	{// nom du fichier nettoyé
    		return $this->cleanFname;
    	}
     
     
    	public function getFileDestination ()
    	{// destination avec nom de fichier nettoyé
    		return $this->file_destination;
    	}
     
     
    	public function getRelativeAddress ()
    	{// adresse par rapport à laquelle sont définis les chemins des dossiers
    		return $this->adresse_relative;
    	}
     
     
    	public function ReturnOctets($val)
    	{// retourne des octets depuis une chaine formatée comme 100 Mo ou 1 g
    		$val = str_replace(array(',',' '),array('.',''),$val);
    		$val = rtrim($val, "oO");
     
    		$last = strtolower(substr($val,-1));
     
    		switch($last)
    		{
    			case 't':  $val *= 1024;
    			case 'g':  $val *= 1024;
    			case 'm': $val *= 1024;
    			case 'k':  $val *= 1024;
    		}
    		return $val;
    	}
     
     
    	public function addInfosServer ($value)
    	{// Ajoute un message texte ou html dans le retour d'information général du formulaire ayant la classe "UpAbci_infosServer". Pourra également être récupéré en second paramètre des fonctions javascript événementielles "config.func_FileEndEach" et "config.func_FormEnd"
    		$this->reponse_upload = array_merge($this->reponse_upload,array("infos_server" => $value));
    	}
     
     
    	public function addMixteServer($mixte)
    	{// Envoie un contenu texte, html ou un tableau de données qui pourra être récupéré en troisième paramètre des fonctions javascript événementielles "config.func_FileEndEach" et "config.func_FormEnd". N'affiche rien dans le html. Vous devrez exploiter ces données comme bon vous semble.
    		$this->reponse_upload = array_merge($this->reponse_upload,array("mixte_server" => $mixte));
    	}
     
     
    	/* Stoppe la soumission du formulaire. Cette commande ne sort pas du script en cours, utilisez exitReponseAjax() par la suite.
    	Si l'option de configuration javascript config.queryFormEnd = true l'éventuelle requête de confirmation de fin de formulaire sera envoyée uniquement si le paramètre $query_end vaut true. 
    	*/
    	public function stopForm($query_end = false)
    	{	
    		$this->reponse_upload['stop_form'] = trim($query_end) != false ? 1 : 0;// ne pas modifier
    	}
     
     
    	/* 
    	Sort du script en ajoutant un message qui sera concaténé au statut "info.status.erreur" de la classe javascript et envoyé dans le bloc html du fichier ayant la classe "UpAbci_status". Ne transmet PAS les éventuels messages précédemment ajoutés avec les fonctions addInfosServer() ou addMixteServer(), dans ce cas utilisez la fonction addStatusErreur($value). 
    	*/
    	public function exitStatusErreur ($value)
    	{ 
    		exit(json_encode(array('erreur' => $value)));
    	}
     
     
    	// à utiliser AVANT la fonction "Upload" (si vous l'utilisez après, le fichier devra être téléchargé avant que le visiteur puisse avoir l'information)
    	public function VerifExtensions($fichier,$extensions)
    	{
    		$filesExtensions = is_array($extensions) ? array_map('strtolower',$extensions) : array();
    		$extension_fichier = strtolower(pathinfo($fichier, PATHINFO_EXTENSION));
    		// si le tableau des extensions autorisées est vide on accepte toutes les extensions					 
    		if (count($filesExtensions) == 0 || in_array($extension_fichier,$filesExtensions))				 
    		return true;
    		else
    		return false;                  
    	}
     
     
    	/* Ajoute un message qui sera concaténé au statut "info.status.erreur" de la classe javascript et envoyé dans le bloc html ayant la classe "UpAbci_status". Ne sort pas du script, utilisez exitReponseAjax() par la suite. 
    	A utiliser après la fonction "Upload" si vous souhaitez préserver un fichier partiellement ou totalement téléchargé.
    	*/
    	public function addStatusErreur($value)
    	{
    		if(empty($this->reponse_upload['erreur'])) 
    		{
    			$this->reponse_upload['erreur'] = $value;
    		}
    		$this->reponse_upload['resultat'] = 'add_status_erreur';// ne pas modifier
    		return false;
    	}
     
     
    	// à utiliser APRES la fonction "Upload"
    	public function getTempAdressFileComplete()
    	{// retourne l'adresse du fichier temporaire s'il est complet et valide sinon false
    		return $this->fichier_verif ? $this->file_temp_address : false;
    	}
     
     
    	// à utiliser APRES la fonction "Upload"
    	public function getTempAdressFile()
    	{// retourne l'adresse du fichier temporaire. Peut être un fragment de fichier.
    		return is_file($this->file_temp_address)? $this->file_temp_address : false;
    	}
     
     
    	// à utiliser APRES la fonction "Upload" supprime le cookie de sauvegarde
    	public function deleteCookieSave()
    	{
    		setcookie($this->cookie_name,"",time()-3600,$this->cookie_path);
    	}
     
     
    	/* A utiliser AVANT la fonction "Transfert" et de préférence après avoir vérifié que le fichier est complet afin de minimiser l'utilisation de cette fonction qui peut être assez gourmande en ressource (en fonction du nombre de fichiers du répertoire) si le deuxième paramètre est renseigné pour renommer les fichiers en mode incrémental.
    	
    	 "RenameIdenticName()" renomme le fichier téléchargé si un fichier de même nom existe déjà sur le serveur. 
    	Par défaut la fonction ajoute un identifiant unique (uniqid) au nom des fichiers.
    	- Avec un second argument optionnel quelconque (ex : $up->RenameIdenticName($destination_fichier,'incr');) le nom des fichiers est incrémenté.  
    	- Un troisième argument optionnel casse sensivitive est également disponible, mais à n'utiliser que sur les serveurs casse sensitive (NE PAS UTILISER AVEC LES SERVEURS WINDOWS).
    	- Ne touchez pas aux paramètres 4 et 5.
    	*/
    	public function RenameIdenticName($adresse_fichier, $incr = false, $unix = false, $stop = 0, $isfile = false)
    	{
    		if ($isfile || is_file($adresse_fichier))
    		{
    			$info = pathinfo($adresse_fichier);
    			$extension = isset($info['extension']) && $info['extension'] != '' ? '.'.$info['extension'] : null;
    			$dossier = $info['dirname'];
    			$filename = $info['filename'];
     
    			if (trim($incr) != false && $stop < 90)// le stop arbitrtaire est une mesure de sécurité au cas où...
    			{
    				$file = addcslashes($filename,'.');			
    				$ext = isset($extension) ? addcslashes($extension,'.') : null;									
     
    				$match = trim($unix) != false ? '#^'.$file.'-[0-9]+'.$ext.'$#' : '#^'.$file.'-[0-9]+'.$ext.'$#i';
     
    				$tab_identique = array();
     
    				$files = new RegexIterator(new DirectoryIterator($dossier),$match);
    				foreach ($files as $fileinfo) $tab_identique[] = $fileinfo->getFilename();
     
    				natsort($tab_identique);
     
    				$dernier = array_pop($tab_identique);
     
    				unset($tab_identique);
     
    				$dernier = isset($dernier)? pathinfo($dernier, PATHINFO_FILENAME) : '';
     
    				$file = preg_replace_callback('#([0-9]+$)#', create_function('$matches','return $matches[1]+1;'), $dernier, '1', $count);
     
    				$filename = !empty($count)? $file : $filename.'-1';
    			}
    			else
    			{
    				$filename .= '-'.uniqid();
    			}
     
    			$filename = isset($extension) ? $filename.$extension : $filename;												
     
    			$adresse = $dossier.'/'.$filename;
     
    			if (!is_file($adresse)) return $adresse;
    			else																													
    			return Rename_fich($adresse_fichier, $incr, $unix, ++$stop, true);                        
    		}																				 
    		else 
    		{
    			return $adresse_fichier;
    		}
    	}
     
     
    	// à utiliser normalement APRES la fonction "Transfert"
    	public function addStatusOk ($value)
    	{// ajoute un message qui sera concaténé au statut "this.info.status.ok" de la classe javascript et envoyé dans le bloc html ayant la classe "UpAbci_status"
    		$this->reponse_upload = array_merge($this->reponse_upload,array("ok" => $value));
    	}
     
     
    	// à utiliser APRES la fonction "Transfert" (a le même effet que de tester le retour de la fonction Transfert())
    	public function getTransfertOk ()
    	{// le fichier est complet et a été déplacé avec succès vers son emplacement définitif
    		return isset($this->reponse_upload['resultat']) && $this->reponse_upload['resultat'] == 'upload_ok';
    	}
     
     
    	// Retour d'information OBLIGATOIRE et INDISPENSABLE pour le script ajax excepté si la fonction exitStatusErreur() a été utilisée.
    	public function exitReponseAjax()
    	{
    		exit(json_encode($this->reponse_upload));
    	}
     
     
    	// ------------------------------------------------------------------------------- 
    	// -------------------------------------------------------------------------------
     
     
    	// Variables ajax 
    	public $UpAbci_form = array();
    	public $UpAbci_formEnd = array();
    	protected $UpAbci_fragment;
    	protected $UpAbci_blobSlice;
    	protected $UpAbci_fileEnd;
     
     
    	// Variables php
    	protected $dossier_destination;
    	protected $dossier_temporaire;
    	protected $cleanFname;
    	protected $cookie_time;
    	protected $cookie_path;
    	protected $adresse_relative;
    	protected $verif_filesize_sup2Go;
    	protected $cookie_name;
    	protected $cookie_filesize;
    	protected $file_temp_address;
    	protected $file_destination;
    	protected $fichier_verif = false;
    	protected $reponse_upload = array();
    	protected $config_erreur_serveur = array();
    	protected $mode_debug = false;
    	protected $save_all = false;
     
     
    	public function __construct($dossier_destination = null, $dossier_temporaire = null, $cookie_heures = null, $cookie_path = null, $adresse_relative = null, $verif_filesize_sup2Go = false)
    	{
    		$this->dossier_destination = trim($dossier_destination);
    		$this->dossier_temporaire = trim($dossier_temporaire);
    		$this->cookie_time = is_numeric($cookie_heures) && $cookie_heures > 0 ? time()+3600*$cookie_heures : time()+3600*24;
    		$this->cookie_path = trim($cookie_path) != false ?  trim($cookie_path) : '/';		
    		$this->adresse_relative = trim($adresse_relative) != '' ? $adresse_relative : str_replace('\\','/',__DIR__).'/';
    		$this->verif_filesize_sup2Go = trim($verif_filesize_sup2Go) != false;
     
    		$this->GetPostFile();		
    	}
     
     
    	private function GetPostFile()
    	{
    		$UpAbci_form = isset($_POST['UpAbci_form']) ? $_POST['UpAbci_form'] : null;
    		if(!empty($UpAbci_form)) 
    		{
    			parse_str($UpAbci_form, $this->UpAbci_form);			
    		}
     
    		$UpAbci_formEnd = isset($_POST['UpAbci_formEnd']) && is_array($_POST['UpAbci_formEnd']) ? $_POST['UpAbci_formEnd'] : array() ;
    		if(count($UpAbci_formEnd) > 0)
    		{
    			$output = array();
    			foreach($UpAbci_formEnd as $value)
    			{
    				parse_str($value, $output);
    				$this->UpAbci_formEnd[] = $output;
    			}
    		}
     
     
     
     
    		$this->UpAbci_fragment = isset($_FILES['UpAbci_fragment']) ? $_FILES['UpAbci_fragment'] : null;
    		$this->UpAbci_fragment = !isset($this->UpAbci_fragment) && filter_input(INPUT_POST, 'UpAbci_fragment') ? 1 : $this->UpAbci_fragment;// si post UpAbci_fragment existe c'est que le script javascript à trouvé une sauvegarde complète et a remplacé file UpAbci_fragment par post UpAbci_fragment.
     
    		if(isset($this->UpAbci_fragment)) 
    		{
    			$this->cleanFname = $this->CleanFileName($this->getParam("name"));				
     
    			$this->UpAbci_blobSlice = urldecode(filter_input(INPUT_POST, 'UpAbci_blobSlice'));
    			$this->UpAbci_blobSlice = $this->UpAbci_blobSlice == 1;
     
    			$this->UpAbci_fileEnd = urldecode(filter_input(INPUT_POST, 'UpAbci_fileEnd'));
    			$this->UpAbci_fileEnd = $this->UpAbci_fileEnd == 1;
     
    			$this->cookie_name = $this->getParam('cook_name');
     
    			$cook_save = isset($_COOKIE[$this->cookie_name]) ? urldecode($_COOKIE[$this->cookie_name]) : null;
    			$cook_save = isset($cook_save) ? explode('|',$cook_save) : null;
    			$cook_save_temp_adresse = isset($cook_save[0]) ? $cook_save[0] : null; 
    			$this->cookie_filesize = isset($cook_save[1]) ? $cook_save[1] : 0; 
     
    			$this->file_temp_address = isset($cook_save_temp_adresse) ? $cook_save_temp_adresse : $this->adresse_relative.$this->dossier_temporaire.hash("sha256",(uniqid($this->getParam("uniqid_form"),true).uniqid($this->getParam("uniqid_file"),true)));	
     
    			$this->file_destination = $this->adresse_relative.$this->dossier_destination.$this->cleanFname;	
    		}
     
    		register_shutdown_function(array($this, 'Shutdown'));
     
    	}
     
     
     
    	public function Upload ()
    	{			
    		if(isset($this->UpAbci_fragment)) 
    		{
    			// Permet de récupérer le fichier temporaire s'il existe, s'il est complet et s'il n'est pas corrompu. Peut-être utile au cas où une erreur php se serait produite lors d'un traitement après l'upload complet (crop etc.). Evite d'attendre à nouveau pour le téléchargement lors des essais ultérieurs.
    			if ($this->cookie_filesize == $this->getParam("size") && $this->UpAbci_fileEnd && $this->UpAbci_fragment === 1)
    			{
    				$size_upload = @filesize($this->file_temp_address);
     
    				if($size_upload == $this->getParam("size"))
    				{
    					$this->fichier_verif = true;
    					return true;
    				}
    			}
    			// si $this->UpAbci_fragment === 1 => pas de fichier joint mais uniquement ses coordonnées pour récupérer la sauvegarde. Si l'on a passé la condition précédente c'est que la sauvegarde est non valide et l'on sort.
    			if ($this->UpAbci_fragment === 1) 
    			{
    				$this->reponse_upload['erreur'] = 'Fichier temporaire non valide.';
    				setcookie($this->cookie_name,"",time()-3600,$this->cookie_path);
    				@unlink($this->file_temp_address);
    				return false;
    			}
     
    			// Vérifs			
    			if($this->getParam("uniqid_file") == '')
    			{
    				$this->reponse_upload['erreur'] = 'Identifiant de fichier non valide.';
    				return false;
    			}
     
    			if($this->getParam("name") == '')
    			{
    				$this->reponse_upload['erreur'] = 'Nom de fichier non valide.';
    				return false;
    			}
     
    			if($this->getParam("size") == '')
    			{
    				$this->reponse_upload['erreur'] = 'Taille du fichier non valide.';
    				return false;
    			}
     
    			if(!is_uploaded_file($this->UpAbci_fragment['tmp_name']))
    			{
    				$this->reponse_upload['erreur'] = 'Provenance du fichier non valide.';
    				return false;					
    			}
     
    			// uploads
    			if(!$this->UpAbci_blobSlice && !$this->save_all) // si le fichier est d'un seul morceau et que saveAll() n'a pas été configuré
    			{
    				$this->file_temp_address = $this->UpAbci_fragment['tmp_name'];
    			}
    			else
    			{
    				 // On ouvre ou on crée le fichier
    				$fichier_cible = @fopen($this->file_temp_address, 'a+');
    				if($fichier_cible === false)
    				{
    					$this->reponse_upload['erreur'] = 'Erreur d\'ouverture du fichier temporaire.';
    					return false;
    				}
     
    				// On ouvre le contenu téléchargé
    				$upload_file = @fopen($this->UpAbci_fragment['tmp_name'], 'rb');
    				if($upload_file === false)
    				{
    					$this->reponse_upload['erreur'] = 'Erreur d\'ouverture du contenu téléchargé.';
    					return false;
    				}
     
    				// On lit son contenu dans une variable
    				$upload_size = $this->UpAbci_fragment['size'];
    				$upload_content = @fread($upload_file, $upload_size);
    				if($upload_content === false)
    				{
    					$this->reponse_upload['erreur'] = 'Erreur de lecture du contenu téléchargé.';
    					setcookie($this->cookie_name,"",time()-3600,$this->cookie_path);
    					@unlink($this->file_temp_address);
    					return false;
    				}	
     
    				fclose($upload_file);
     
    				// On l'écrit dans le fichier temporaire
    				if(@fwrite($fichier_cible, $upload_content) === false)
    				{
    					$this->reponse_upload['erreur'] = 'Erreur d\'écriture du contenu téléchargé.';
    					return false;
    				}	
     
    				unset($upload_content);
     
    				fclose($fichier_cible);
     
    				$new_file_size = $this->cookie_filesize + $upload_size;
     
    				setcookie($this->cookie_name,urlencode($this->file_temp_address.'|'.$new_file_size),$this->cookie_time,$this->cookie_path);
     
    				if (!$this->UpAbci_fileEnd)
    				{
    					if( !((isset($this->reponse_upload['resultat']) && $this->reponse_upload['resultat'] == 'add_status_erreur') || isset($this->reponse_upload['stop_form'])))
    					{
    						$this->reponse_upload['resultat'] = 'continu';
    						return true;
    					}
    				}
    			}
     
    			if ($this->UpAbci_fileEnd)
    			{
    				$this->fichier_verif = true;
     
    				// vérification de l'intégrité du fichier (automatique pour les fichiers de moins de 2 Go)
    				if ($this->verif_filesize_sup2Go || $this->getParam("size") < $this->ReturnOctets('2 Go'))
    				{
    					$size_upload = @filesize($this->file_temp_address);
     
    					if($size_upload != $this->getParam("size"))
    					{
    						$this->fichier_verif = false;
     
    						if($this->UpAbci_blobSlice || $this->save_all)
    						{
    							setcookie($this->cookie_name,"",time()-3600,$this->cookie_path);
     
    							$this->reponse_upload['erreur'] = 'Erreurs possibles : la sauvegarde utilisée a été enregistrée lors d\'un instant critique. Ou vous avez téléchargé ce même fichier simultanément depuis deux fenêtres différentes.';
    							return false;
    						}
    						else
    						{
    							$this->reponse_upload['erreur'] = 'Erreurs dans la vérification de l\'intégrité du fichier.';
    							return false;
    						}
    					}
    				}
    			}
     
    			return true;
    		}
     
    		return false;
    	}
     
     
     
    	public function Transfert ($file_destination = null)
    	{		
    		$this->file_destination = trim($file_destination) != '' ? $file_destination : $this->file_destination;
     
    		if($this->UpAbci_fileEnd)
    		{
    			if(isset($_COOKIE[$this->cookie_name]) || $this->save_all)
    			{
    				setcookie($this->cookie_name,"",time()-3600,$this->cookie_path);
    			}		
     
    			if(trim($this->file_destination) == '')
    			{
    				$this->reponse_upload['erreur'] = 'Destination du fichier non valide.';
    				return false;
    			}
     
    			if(!is_file($this->file_temp_address) || !$this->fichier_verif)
    			{
    				$this->reponse_upload['erreur'] = 'Fichier temporaire non valide.';
    				return false;
    			}
     
    			if(@rename($this->file_temp_address,$this->file_destination)) 
    			{
    				$this->reponse_upload['resultat'] = 'upload_ok';
    				return true;
    			}
    			else
    			{
    				$this->reponse_upload['resultat'] = false;
    				$this->reponse_upload['erreur'] = 'Problème dans le transfert du fichier.';
    				return false;
    			}
    		}
     
    		return false;
    	}
     
     
     
    	// La fonction "CleanFileName" est utilisée par défaut dans la fonction "GetPostFile" elle-même appelée par le constructeur de la classe
    	public function CleanFileName($nom_fichier)
    	{
    		// recuperation de la ligne de l enregistrement
    		$nom_image_name_file= urldecode($_POST['nom_image_name_file']);
     
    		$info = pathinfo($nom_fichier);
    		$extension = isset($info['extension']) && $info['extension'] != '' ? '.'.$info['extension'] : null;
    		$dossier = $info['dirname'] != '.' ? $info['dirname'].'/' : null  ;
    		// $filename = $info['filename'];
    		$filename = $nom_image_name_file;
    		$filename = strtolower($filename);	// strtolower(): Renvoie une chaîne en minuscules
     
    		$cible = array(
    		'-', "'", '(', ')',
    		'À', 'Á', 'Â', 'Ã', 'Ä', 'Å', 'Æ', 'Ă', 'Ą',
    		'Ç', 'Ć', 'Č', 'Œ',
    		'Ď', 'Đ',
    		'à', 'á', 'â', 'ã', 'ä', 'å', 'æ', 'ă', 'ą',
    		'ç', 'ć', 'č', 'œ',
    		'ď', 'đ',
    		'È', 'É', 'Ê', 'Ë', 'Ę', 'Ě',
    		'Ğ',
    		'Ì', 'Í', 'Î', 'Ï', 'İ',
    		'Ĺ', 'Ľ', 'Ł',
    		'è', 'é', 'ê', 'ë', 'ę', 'ě',
    		'ğ',
    		'ì', 'í', 'î', 'ï', 'ı',
    		'ĺ', 'ľ', 'ł',
    		'Ñ', 'Ń', 'Ň',
    		'Ò', 'Ó', 'Ô', 'Õ', 'Ö', 'Ø', 'Ő',
    		'Ŕ', 'Ř',
    		'Ś', 'Ş', 'Š',
    		'ñ', 'ń', 'ň',
    		'ò', 'ó', 'ô', 'ö', 'ø', 'ő',
    		'ŕ', 'ř',
    		'ś', 'ş', 'š',
    		'Ţ', 'Ť',
    		'Ù', 'Ú', 'Û', 'Ų', 'Ü', 'Ů', 'Ű',
    		'Ý', 'ß',
    		'Ź', 'Ż', 'Ž',
    		'ţ', 'ť',
    		'ù', 'ú', 'û', 'ų', 'ü', 'ů', 'ű',
    		'ý', 'ÿ',
    		'ź', 'ż', 'ž',
    		'А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ё', 'Ж', 'З', 'И', 'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р',
    		'а', 'б', 'в', 'г', 'д', 'е', 'ё', 'ж', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'р',
    		'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Ъ', 'Ы', 'Ь', 'Э', 'Ю', 'Я',
    		'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', 'ъ', 'ы', 'ь', 'э', 'ю', 'я'
    		);
     
    		$rempl = array(
    		'_', "_", '_', '_',
    		'A', 'A', 'A', 'A', 'A', 'A', 'AE', 'A', 'A',
    		'C', 'C', 'C', 'CE',
    		'D', 'D',
    		'a', 'a', 'a', 'a', 'a', 'a', 'ae', 'a', 'a',
    		'c', 'c', 'c', 'ce',
    		'd', 'd',
    		'E', 'E', 'E', 'E', 'E', 'E',
    		'G',
    		'I', 'I', 'I', 'I', 'I',
    		'L', 'L', 'L',
    		'e', 'e', 'e', 'e', 'e', 'e',
    		'g',
    		'i', 'i', 'i', 'i', 'i',
    		'l', 'l', 'l',
    		'N', 'N', 'N',
    		'O', 'O', 'O', 'O', 'O', 'O', 'O',
    		'R', 'R',
    		'S', 'S', 'S',
    		'n', 'n', 'n',
    		'o', 'o', 'o', 'o', 'o', 'o',
    		'r', 'r',
    		's', 's', 's',
    		'T', 'T',
    		'U', 'U', 'U', 'U', 'U', 'U', 'U',
    		'Y', 'Y',
    		'Z', 'Z', 'Z',
    		't', 't',
    		'u', 'u', 'u', 'u', 'u', 'u', 'u',
    		'y', 'y',
    		'z', 'z', 'z',
    		'A', 'B', 'B', 'r', 'A', 'E', 'E', 'X', '3', 'N', 'N', 'K', 'N', 'M', 'H', 'O', 'N', 'P',
    		'a', 'b', 'b', 'r', 'a', 'e', 'e', 'x', '3', 'n', 'n', 'k', 'n', 'm', 'h', 'o', 'p',
    		'C', 'T', 'Y', 'O', 'X', 'U', 'u', 'W', 'W', 'b', 'b', 'b', 'E', 'O', 'R',
    		'c', 't', 'y', 'o', 'x', 'u', 'u', 'w', 'w', 'b', 'b', 'b', 'e', 'o', 'r'
    		);
     
    		$nom_fichier = str_replace($cible, $rempl, $filename);// préserve le maximum de caractères utiles
     
    		$nom_fichier = preg_replace('#[^.a-z0-9_-]+#i', '-', $nom_fichier);// uniquement alphanumérique et . et _ et -
    		$nom_fichier = preg_replace('#-{2,}#','-',$nom_fichier);// supprime les occurences successives de '-'
     
    		// Supprime le dernier "-" de remplacement excepté si ce caractère existait déjà à la fin du nom original
    		$nom_fichier = substr($filename, -1) != "-" ? rtrim($nom_fichier,'-') : $nom_fichier;
     
    		return $dossier.$nom_fichier.$extension;
    	}
     
     
     
    	public function Shutdown()
    	{
    		$fatal_error = false;
    		if ($error = error_get_last())
    		{
    			switch($error['type'])
    			{
    				case E_ERROR:
    				case E_CORE_ERROR:
    				case E_COMPILE_ERROR:
    				case E_USER_ERROR:
    				$fatal_error = true;
    				break;
    			}
    		}
     
    		if ($fatal_error)
    		{
    			$message = null;
    			foreach($this->config_erreur_serveur as $key => $value)
    			{
    				if (strpos($error['message'],$key) !== false)
    				{
    					if(is_array($value))
    					{
    						$message = isset($value[0])? $value[0] : '';
    						if(isset($value[1]) && trim($value[1]) != false)
    						{
    							setcookie($this->cookie_name,"",time()-3600,$this->cookie_path);
    							@unlink($this->file_temp_address);
    						}
    					}
    					else
    					{
    						$message = $value;
    					}
    				}
    			}
     
    			if(!isset($message) && $this->mode_debug)
    			{
    				$message = $error['message'];
    			}
     
    			exit($message);
    		}
    	}
    }
    ?>

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [Images] Affichage et réduire poids d'une image
    Par fabrice88 dans le forum Bibliothèques et frameworks
    Réponses: 4
    Dernier message: 07/05/2008, 09h25
  2. Réponses: 1
    Dernier message: 17/03/2008, 13h33
  3. Limiter le poids d'une image
    Par mickado dans le forum Langage
    Réponses: 3
    Dernier message: 20/06/2007, 09h44
  4. Detecter le poids d'une image avec l'objet DOM
    Par crimsonPhantom dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 21/07/2006, 16h54
  5. Poids d'une image a partir d'une url
    Par matique dans le forum Langage
    Réponses: 4
    Dernier message: 11/02/2006, 20h41

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