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

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

Téléchargez Discussion :

Upload de gros fichiers par fragments (chunk)


Sujet :

Téléchargez

  1. #241
    Expert éminent sénior

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

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

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

    Pour info j'ai refais une petite mise à jour le 30/11/2020 quelques jours après la précédente mise à jour - version 7.6 - après m'être aperçu que le cookie qui sauvegardait les préférences du menu du mode d'emploi (fichier index.html) ne fonctionnait plus. C'est corrigé. Par la même occasion, j'ai fait en sorte qu'un clic sur les liens internes du mode d'emploi qui ne correspondent pas à un lien du menu, provoque le surlignement du paragraphe parent dans le menu, cela permet de mieux les situer. Quelques points du chapitre "Debug" ont également été reprécisés.

    Le code des classes Php et Javascript d'uplod est inchangé, cette petite mise à jour ne concerne que le mode d'emploi, aussi j'ai gardé le même numéro de version 7.6. Cela dit, le fichier "index.html" du mode d'emploi fait maintenant appel au script "MenuFixedABCI.js" inclus dans le dossier "Javascript", il faudra donc également mettre à jour ce dossier en y intégrant ce script si vous faites une mise à jour partielle uniquement pour le mode d'emploi.

  2. #242
    Expert éminent sénior

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

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut Module d'Upload Ajax/Php prêt à l'emploi
    Upload Ajax-Php, version 7.6b
    disponible ici


    A/ Mise à jour du code php

    1/ Classe NettoyageTemp
    Cette classe qui n'est pas indispensable pour l'upload des fichiers, permet de nettoyer le dossier des fichiers temporaires devenus obsolètes.

    La méthode nettoyage() accepte maintenant deux arguments pour définir l'adresse du dossier temporaire et la durée de vie du cookie de sauvegarde, dans le cas où vous définissez, lors de l'initialisation de la classer serveur UploadAjaxABCIServeur, des valeurs différentes de celles indiquées dans le trait ParamDefautServeur qui sont utilisées par défaut.

    Une seconde méthode interval() vient compléter cette classe pour déclencher la fonction de nettoyage à intervalle régulier (par défaut 86400 secondes soit 24h). Cela permet d'éviter la création d'une tâche programmée pour effectuer cette maintenance.
    La fonctionnalité NettoyageTemp::interval() est maintenant intégrée dans tous les scripts de formulaire. Vous pouvez éventuellement la supprimer mais elle vous garanti un nettoyage périodique du dossier temporaire sans affecter significativement les ressources serveur.

    Ces méthodes sont principalement utiles pour l'upload de gros fichiers, puisque ce module d'upload permet (entre autre) de télécharger de très gros fichiers par fragmentation en surpassant les limites serveur "upload_max_filesize", "post_max_size", et "max_file_uploads".

    2/ Classe SymfonyMapType
    Plus d'une centaine de MIME types ont été ajoutés, de même que de nouvelles extensions correspondant à des MIME type déjà existants. Pour information, le lien vers le dépôt GitHub est indiqué en entête du fichier "SymfonyMapType.php" pour vous permettre de mettre à jour ce fichier périodiquement si besoin.


    B/ Mise à jour du mode d'emploi
    Informations sur la classe NettoyageTemp, correction de certains liens internes du mode d'emploi qui ne déclenchaient pas l'ouverture du paragraphe parent dans le menu, et autres précisions/corrections mineures.

    Je précise au passage que la longueur du mode d'emploi (équivalent du fichier "index.html" du dossier en téléchargement) n'est pas représentative de la mise en oeuvre de ce module d'upload. De nombreuses fonctionnalités et options disponibles dans les classes d'upload sont détaillées pour répondre aux besoins les plus divers, et je suis verbeux à l'attention des débutants. Ceci expliquant cela. Mais vous pouvez configurer un script en quelques lignes aussi bien côté formulaire que côté serveur tout en bénéficiant de fonctionnalités avancées, voir les paragraphes 2.3 et 2.4 de ce tutoriel (également disponible dans le mode d'emploi).

    Parmi les scripts proposés dans le dossier en téléchargement en complément des formulaires standards:
    - notation de fichiers avec système graphique (coeur, étoile) compatible avec un upload multiple.
    - recadrage d'images côté client.
    - optimisation des images pour le web.
    - redimensionnements successifs avec gestions des erreurs.
    - contrôle des fichiers déjà existants avant upload.
    - formulaire d'inscription avec avatar et contrôle des champs requis et des doublons d'inscription (login ou mail) avant soumission du formulaire.
    - créations d'albums photo.
    etc.

    Tous les scripts inclus dans le dossier en téléchargement sont fonctionnels et vous pouvez les utiliser directement sans modification en changeant simplement le dossier de destination des fichiers défini au début du script serveur, pour le faire correspondre à vos besoins.

    En cas de problème particulier, je répondrai à vos questions dans cette discussion. Vérifier préalablement que la réponse ne se trouve pas dans le mode d'emploi. Ses menus multiples permettent de répondre à la plupart des questions, si j'en crois le peu d'informations complémentaires demandées depuis qu'il a été mis en ligne.

    Cela dit, des suggestions d'amélioration ou un petit commentaire au passage sur l'utilisation de ce module d'upload sont également les bienvenus.

    Voilà

  3. #243
    Membre à l'essai
    Femme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Février 2020
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 24
    Localisation : Gabon

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2020
    Messages : 21
    Points : 21
    Points
    21
    Par défaut L'URL demandée n'a pas pu être trouvée sur ce serveur.
    Bonjour ABCIWEB,

    Avant tout d'abord, big up à toi pour ce magnifique travail.

    J'ai tenté d'utiliser le script d'upload de fichier mais j'ai le message d'erreur suivant :
    Objet non trouvé!

    L'URL demandée n'a pas pu être trouvée sur ce serveur. La référence sur la page citée semble être erronée ou perimée. Nous vous prions d'informer l'auteur de cette page de cette erreur.

    Si vous pensez qu'il s'agit d'une erreur du serveur, veuillez contacter le webmestre.
    Error 404
    J'avoue suis vraiment bloqué à ce niveau et merci de me débloquer !
    Voir capture d'écran

    Nom : erreurpage.jpg
Affichages : 215
Taille : 87,4 Ko

  4. #244
    Expert éminent sénior

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

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

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

    Il doit y avoir un problème de configuration quelque part. As-tu bien décompressé le dossier téléchargé avant de le poser sur ton serveur ? As-tu posé tout le dossier décompressé sur ton serveur d'évaluation ou sur le serveur distant sans rien changer ?

    Quelle est l'URL de cette page qu'Apache ne trouve pas ? C'est la requête de destination Ajax "Php_Upload/UploadAjaxABCI_Upload_Crop_multiple.php" ? Quand le formulaire s'affiche dans ton navigateur tapes sur la touche F12 de ton clavier puis ensuite cliques sur l'onglet "réseau", et enfin tentes un upload, tu auras plus de renseignements sur la requête ajax. Si le fichier n'est pas trouvé c'est vraisemblablement qu'il n'est pas sur ton serveur. Si c'était un autre problème tu aurais un message de droit d'accès, ou autre, mais un 404 indique normalement toujours que le fichier n'est pas trouvé à l'adresse indiquée.

    Tu n'as pas de redirection sur ton serveur qui pourrait changer dynamiquement l'adresse des requêtes, ou interdire certains accès ? Enfin bref ce n'est pas un problème de script c'est un problème de configuration de ton serveur ou de fichier manquant. En haut du mode d'emploi (page "index.html") dans le chapitre "Installation" il y a un lien vers le paragraphe "Debug" qui contient un lien vers la page "Test_config.php", ça donne quoi quand tu cliques sur ce lien ? Toutes les lignes renvoient OK ?

    Aussi si tu as un serveur distant, fais un test en posant le dossier décompressé sur le serveur distant, tu pourras voir plus vite si le problème vient de ta configuration locale. Comme indiqué dans le chapitre "Debug" il y a parfois des problèmes d'accès avec certains serveurs d'évaluation exotiques (sur clé USB etc.) mais le problème disparaît sur un serveur standard local type wampserver, et sur les serveurs distants type OVH etc.

    Reviens donner des nouvelles après avoir fait ces manip et ces tests et si possible avec plus d'informations sur la page qu'Apache ne trouve pas.

  5. #245
    Membre à l'essai
    Femme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Février 2020
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 24
    Localisation : Gabon

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2020
    Messages : 21
    Points : 21
    Points
    21
    Par défaut
    Merci pour ces indications !
    Je travail en local avec xampp server. Je vérifie vos recommandations, à toute

  6. #246
    Membre à l'essai
    Femme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Février 2020
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 24
    Localisation : Gabon

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2020
    Messages : 21
    Points : 21
    Points
    21
    Par défaut
    Sa commence à aller !

    J'utilisais une ancienne version (v7.2cc) qui me donnait le message d'erreur précédent.

    J'ai téléchargé la dernière version (7.6b) et quand j'ai essayé sa fonctionne bien ! Bref, sa ne génère plus de message d'erreur de type 404 en plus les fichiers sont bien envoyés à destination.

    En faite, j'utilise le fichier UploadAjaxABCI_Crop_multiple.php pour envoyer les pièces jointes lors de la création d'un dossier et la seule chose qui me bloque, c'est comment ajouté deux champs personnalisés au formulaire et récupéré la valeur de l'un des champ en POST pour l'utiliser dans le chemin d'accès de la destination des fichiers.

    J'ai pu modifier le chemin de la destination des fichiers envoyés dans le fichier UploadAjaxABCI_Crop_multiple.php contenu dans le dossier Php_Upload
    $dossier_destination[] = '../../img/enterprises/3/'; de façon manuelle.

    Pour mon cas d'utilisation, je voudrais récupérée une variable issue du formulaire et l'utliser dans le chemin d'accès de $dossier_destination[] de façon dynamique.

    Exemple : $dossier_destination[] = '../../img/enterprises/'.$eid.'/';

    Votre aide me serait vraiment utile pour ce dernier point, merci à l'avance !

  7. #247
    Expert éminent sénior

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

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Tu peux prendre exemple sur le champ "légende" qui est joint au fichier, il est justement là pour servir d'exemple de champ additionnel spécifique à chaque fichier. Mais si c'est le même $eid pour tous les fichiers en cas d'upload multiple et que tu veux le renseigner dynamiquement sans passer par une saisie utilisateur tu peux faire aussi :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    <label>Légende <input type="text" name="legende" value = "<?=$eid?>" style="width:200px;"></label>
    Bien sûr tu peux renommer ce champ et si besoin lui attribuer le type "hidden" (à la place de "text"), et en ajouter d'autres.

    Cela répond à ta question ? En tous cas fais attention à cette variable $eid et contrôles-là un maximum dans le script d'upload côté serveur, elle ne doit pas contenir de ".." ni de "/" qui permettrait de naviguer dans ton système de fichiers par exemple sinon c'est une faille de sécurité majeure. D'une manière générale, il faut faire très attention quand le choix du dossier de destination dépend du formulaire côté client.

  8. #248
    Membre habitué
    Inscrit en
    Janvier 2008
    Messages
    1 159
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 1 159
    Points : 149
    Points
    149
    Par défaut Installation nouvelle version
    Bonjour,
    j'ai respecter ce que tu m'a dit j'utiliser l'ancienne version du code qui fonctionne bien il y' a quelques années maintenant je souhaite installer la nouvelle qui est génial bravo.

    Mais je me heurte à un message regulier :
    Connexion non valide ou perdue. Rafraîchissez la page et recharger éventuellement votre fichier, si celui-ci dispose d'une sauvegarde automatique elle sera utilisée.

    ainsi que identifiant de formulaire non valide en popup.

    J'ai remarque en fessant des test que en l'incluant dans mon codes es variable caché ne retourne pas d'id de mon coté.

    <input type="text" name="UpAbci_uniqidForm" value="<?=$UpAbci_uniqidForm?>">
    <input type="text" name="UpAbci_fragmentSize" value="<?=$UpAbci_fragmentSize?>">

    Voici mon code ma page :
    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
    <?php
    include('backups/config.inc.php');
     
    $menu_gauche = false;
     
    // la session est bien active, et la personne est bien connectée ...
    if((isset($_SESSION['email'])) && ($_SESSION['email'] != ''))
    {
     
    $body='
    <body>
    <h3 style="max-width:800px;">
    Exemple customisé avec vérification avant upload
    </h3>
    <form id = "form_custom_verif" action = "#" method = "post">
     
         <input type="file" multiple="multiple" name="upload">
         <input type="text" name="UpAbci_uniqidForm" value="<?=$UpAbci_uniqidForm?>">
         <input type="text" name="UpAbci_fragmentSize" value="<?=$UpAbci_fragmentSize?>">
     
    	<p class="bouton_custom_file">Cliquez ou déposez vos fichiers ici</p>
     
    	<!-- Je pourrais utiliser data-upabcicss-select-file="display:block" dans le bloc ci-dessous pour afficher directement les fichiers dès leur sélection. 
        Je vais utiliser la méthode javascript événementielle "func_FileSelectAll" et exécuter un slide -->
        <div class="content">
            <p class="replace">
     
            <label style="cursor:pointer"><input type="checkbox" name="replace">&nbsp;Autoriser le remplacement des fichiers existants</label>
            </p>
            <div class="infos_form">                            
                <div class="UpAbci_infosFile">
     
                    <div style="position:relative;padding-bottom:0.35em" data-upabcicss-image-preview="height:70px">
     
     
                        <span style="display:inline-block" class="UpAbci_imgPreview" data-upabcicss-image-preview="width:100px"></span>
     
                        <!-- progression graphique --> 
                        <progress class="UpAbci_progressionG" data-upabcicss-in-progress="display:inline" data-upabcicss-result="display:none" data-upabcicss-result-partial="display:inline" data-upabcicss-backup="display:inline"></progress>
     
                        <!-- sauvegarde résultat partiel --> 
                        <span style="display:none" data-upabcicss-result-partial="display:inline;color:#916C00"> sauvegardé : </span><span class="UpAbci_backup" style="display:none" data-upabcicss-result-partial="display:inline"></span>
     
                        <!-- temps restant -->
                        <span style="display:none" data-upabcicss-remaining-time-after="display:inline" data-upabcicss-result="display:none"> temps restant : </span><span class="UpAbci_remainingTime" style="display:none" data-upabcicss-remaining-time-after="display:inline" data-upabcicss-result="display:none"> - </span>
     
                         <!-- si téléchargement ok on affiche un rond vert et un symbol coche -->      
                        <span class="symbol_result" data-upabcicss-result-ok="display:block">&#x2713;</span> 
     
     
                        <span class="symbol_result file_exist" data-upabcicss-result-stop="display:block" data-upabcicss-result-error="display:block" data-upabcicss-result-partial="display:none">x</span>
     
                        <!-- si sauvegarde on affiche un rond jaune-orange et un symbole pause -->       
                        <span class="symbol_result sauvegarde" data-upabcicss-result-partial="display:block">&#x2758;&#x2758;</span>     
                    </div>
     
                    <div style="padding-bottom:0.3em;min-height:2.8em">
                        <input type="button" class="UpAbci_stop arret" style="width:4em;" data-upabcicss-result="cursor:default;opacity:0.4" value="arrêt">
     
                        <!-- nom du fichier -->
                        <span class="UpAbci_name"></span>
     
                        <!-- taille du fichier -->
                        <span class="UpAbci_size">0Mo</span>
     
     
     
                        <p class="UpAbci_status" style="display:none" data-upabcicss-in-progress="display:inline-block" data-upabcicss-result-stop="color:red;display:inline-block" data-upabcicss-result-error="color:red;display:inline-block" data-upabcicss-result-ok="color:#916C00;display:block;font-size:0.9em"></p>     
                    </div>
                  </div>
                  <div style="margin-top:1.5em;min-height:4.7em;">
                      <div>
                        <!-- arrêter tout -->
                        <input type="button" value="Arrêter tout" class="UpAbci_stopAll arret" style="float:left;width:75px" data-upabcicss-form-end="cursor:default;opacity:0.4">
     
                        <!-- bouton fermer -->
                        <input type="button" value="Fermer" class="fermer_formulaire arret" style="float:right;width:55px" data-upabcicss-submit="cursor:default;opacity:0.4" data-upabcicss-form-end="cursor:pointer;opacity:1">
     
                        <!-- bouton envoyer -->
                        <input type="submit" class="submit" value="Envoyer" style="width:125px;font-size:1.2em;display:block;margin:auto;" data-upabcicss-form-end="display:none">
     
     
                        <input type="button" class="submit fin_traitement" style="width:125px;font-size:0.9em;display:none;margin:auto" data-upabcicss-form-end="display:block" value = "Traitement terminé">         
                      </div>
     
     
    				  <div class="UpAbci_infosServer" style="display:none;clear:both;font-size:1.3em;margin-top:0.5em;" data-upabcicss-infos-server="display:block"></div>
                </div>
            </div>
     
            <!-- info si une sauvegarde existe à la fin du traitement de tous les fichiers. Je vais utiliser la méthode javascript événementielle "func_FormEnd()" pour faire 
            un slide -->     
            <div class = "backupend" style="display:none;padding:0.5em;font-size:0.7em;background:#FC0">
            <span style="color:#fff;font-size:13px">&#x2759;&#x2759;&nbsp;&nbsp;</span>Les fichiers partiellement sauvegardés peuvent être complétés pendant 24h.
            </div> 
     
        </div>
     
    </form>';
     
     
    }
    else
    {
     
    	$body.='<p class="error">D&eacute;sol&eacute;, vos informations personnels transmis &agrave; cette page sont incorrects.<br /><br />
    			<a href="index.php">Cliquez ici pour revenir &agrave; la page pr&eacute;cedente</a></p>
    			';
     
    }
     
    include('backups/baseAdmin.php');
    ?>
    le code source a l'air identique à la page UploadAjaxABCI_Custom_VerifFileExist.php qui fonctionne bien sur mon site à part ces deux variable non renvoyé.

    voici la base admin si tu a besoin :
    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
    <?php include('backups/header.inc.php');?>
    <body>
     
     
    <div id="header">
     
     
        </div>
     
        	<!-- fin header -->
    		<!-- debut page entiere -->	
    		 <div id="wrapper">
     
      <?php if($menu_gauche) { include("backups/navigation_gauche.php"); } ?>
     
      <!-- contenu de centre -->
       <div id="page-wrapper">
    	<div class="container-fluid">
    	<?php echo $body;?>
     
     
     
     
    			</div>
     
                 </div>
     
     
     
     
       <?php include('backups/footer.inc.php'); ?>
     
     
    </div>
     
    <script src="Javascript/jquery.js"></script>
    <script src="Javascript/UploadAjaxABCI.js"></script>
    <script>	
    "use strict"; // Vous pouvez supprimer cette ligne en cas d'utilisation d'autres scripts javascript qui ne supportent pas ce mode.
     
    $(function(){
     
    // Destination ajax de l'upload
    var destination_ajax_upload = 'Php_Upload/UploadAjaxABCI_Upload_Custom_VerifFileExist.php';
     
    // Destination ajax de la vérification des fichiers existants
    var destination_ajax_verif_file = 'Php_Upload/UploadAjaxABCI_VerifFileExist.php';
     
    var form = $("#form_custom_verif");
    var infos_form = form.find(".infos_form");
     
    var Up = new UploadAjaxABCI(destination_ajax_upload, form, infos_form);
     
    // Si vous faites un contrôle des extensions (recommandé), vous devez refaire ce même contrôle côté serveur par sécurité.
    //Up.config.filesExtensions = ['jpg','jpeg','png','gif','mp4','avi','mpg','m2ts','mkv','flv','mp3'];
     
    // Il conviendrait peut-être de baisser (ou mettre à zéro) la valeur ci-dessous pour les smartphones.
    Up.config.imgPreviewMaxSizeTotal = 500; // en Mo poids total maximum de toutes les photos. Au delà les vignettes ne seront pas affichées.
     
    /* (Les valeurs par défaut sont 90 et 60)
    En pixels, hauteur maximale de l'aperçu. Si vous modifier cette valeur faites de même dans le html pour le data-upabcicss-image-preview="height:70px".
    */
    Up.config.imgPreviewMaxHeight = 70;
     
    // En pixels, largeur maximale de l'aperçu. Si vous modifier cette valeur faites de même dans le html pour le data-upabcicss-image-preview="width:100px".
    Up.config.imgPreviewMaxWidth = 100; 
     
    // Option pour indiquer un élément html en remplacement du bouton de sélection des fichiers par défaut du navigateur.
    Up.config.customFileSelect = ".bouton_custom_file";
     
    // Durant le téléchargement des fichiers, applique ces effets sur le bouton d'envoi du formulaire.
    Up.config.cssSubmitOn = "cursor:wait;opacity:0.4";
     
    // Durant le téléchargement des fichiers, applique ces effets le bouton de sélection des fichiers.
    Up.config.cssFileSelectOn = "cursor:wait;opacity:0.7;color:#222";
     
    /* Il s'agit d'une boite spécifiquement dédiée à l'upload, j'interdis donc la soumission du formulaire si aucun fichier n'est soumis. 
    Economise une requête inutile si tous les fichiers sélectionnés ont été arrêtés avant l'envoi et que le formulaire est néanmoins soumis. 
    Voir "config.submitWithoutFileFuncFormEnd" à la ligne suivante qui indispensable dans cet exemple.
    */
    Up.config.submitWithoutFile = false;
     
    /* Si Upload.config.submitWithoutFile = false, l'option ci-dessous (cf mode d'emploi) permet néanmoins le déclenchement de la méthode 
    événementielle "config.func_FormEnd" dont j'ai besoin pour afficher le récapitulatif en fin de traitement du formulaire.
    */
    Up.config.submitWithoutFileFuncFormEnd = true;
     
     
    // Modification des messages par défaut de la classe javascript
    Up.info.status.inProgress = '<span style="color:green;font-style:italic">&nbsp;en cours...</span>';
    Up.info.status.stop = 'arrêt';
    /* Modification de la réponse textuelle du status si téléchargement ok. En mettant vide seules les informations envoyées par php en retour de requête ajax seront affichées. 
    C'est le rond vert défini avec la classe "symbol_result" qui témoignera du status ok.
    */
    Up.info.status.ok = ""; 
     
     
     
    // Définitions de variables nécessaires au script. 
    var content = form.find(".content")
    // Bouton case à cocher
    ,replacef = content.find("input[name=replace]")
    ,custom_select = form.find(Up.config.customFileSelect)
    ,custom_select_texte = custom_select.text()
    ,custom_select_remplacement = "Traitement en cours..."
    ,fermer_formulaire = $()
    ,info_server = $()
    ,verif_deferred = false
    ,slideUp = function(){content.slideUp(400)};
     
     
     
    // Définition d'une méthode javascript événementielle "config.func_FileSelectAll" qui sera exécutée à la sélection des fichiers.
    Up.config.func_FileSelectAll = function(event,tableau)
    {
    	/* Par sécurité je décoche l'autorisation de remplacement pour chaque nouvelle sélection de fichiers (ligne à supprimer si l'on veut conserver l'état 
    	du checkbox pour différentes sélections de fichier successives, ou si l'on veut indiquer l'attribut checked par défaut dans le html).
    	*/
    	replacef.prop('checked',false);
     
    	/* Je réactive le checkbox car je le désactive durant l'envoi des fichiers. Cette ligne peut être conservée dans tous les cas de figure et DOIT être conservée 
    	à moins de modifier également les méthodes func_FormSubmit et func_FormEnd).
    	*/
    	replacef.prop('disabled',false);
     
    	// J'enregistre le block d'information serveur qui servira plus loin et dans les méthodes suivantes
    	info_server = form.find(".UpAbci_infosServer");
     
    	// Le bouton de fermeture servira également plus loin et dans les méthodes suivantes
    	fermer_formulaire = form.find(".fermer_formulaire");
     
    	// L'input(s) de type file sera désactivé durant la requête de vérification des fichiers déjà existants
    	var input_file = form.find('input[type="file"]');
     
     
    	// Fontion pour définir les propriétés des fichiers et le formatage si l'on autorise le remplacement des fichiers existants
    	function remplace(f)
    	{
    		// Si le visiteur n'a pas choisi d'arrêter son fichier (f.stop = 0)
    		if(f.stop === 0)
    		{
    			// Affecte la valeur 0 à la propriété interne d'erreur du fichier pour permettre son transfert.
    			f.fichier.upabciErrorUser = 0;
     
    			// J'envoie un message dans le bloc du status d'information
    			f.upAbci.status.html('<span style="color:red">Le fichier existant sera remplacé</span>').css('display','inline-block');
     
    			// Je cache le rond rouge
    			f.infosFile.find(".file_exist").css('display','none');
    		}
    	}
     
     
    	// Fontion pour définir les propriétés des fichiers et le formatage si l'on autorise PAS le remplacement des fichiers existants
    	function noremplace(f)
    	{
    		// Si le visiteur n'a pas choisi d'arrêter son fichier (f.stop = 0)
    		if(f.stop === 0)
    		{
    			// Affecte la valeur 1 à la propriété interne d'erreur du fichier pour interdire son transfert.
    			f.fichier.upabciErrorUser = 1;
     
    			// J'envoie un message dans le bloc du status d'information
    			f.upAbci.status.html('<span style="color:red">Ce fichier existe déjà</span>').css('display','inline-block');
     
    			// Je fais afficher le rond rouge
    			f.infosFile.find(".file_exist").css('display','block');
    		}
    	}
     
     
    	// Initialise le tableau des fichiers sélectionnés qui sera passé côté serveur pour vérification des fichiers déjà existants.
    	var controle_files = {};
     
    	/* Il y a un tableau d'objets par fichier
    	Cf mode d'emploi section "Options de la classe Javascript", paragraphe "Contenu des objets spécifiques à chaque fichier", et faire console.log(tableau) 
    	pour comprendre l'exploitation des propriétés des objets.
    	//console.log(tableau);
    	*/
    	$.each(tableau, function(i,f)
    	{
    		/* Je contruis un objet (controle_files) qui sera envoyé vers le serveur pour contrôler l'existence des fichiers avant la soumission du formulaire.  
     
    		La propriété "fichier.upabciErrorUser" comptabilise les erreurs utilisateur d'extension et/ou de taille de fichier si on a utilisé les options de 
    		configuration "config.filesExtensions" et/ou "config.fileSizeMax". Si la valeur de "fichier.upabciErrorUser" est supérieure à zéro le fichier 
    		ne sera pas soumis au serveur par la classe javascript.
     
    		J'exclus  donc ces fichiers ayant une erreur utilisateur (extension ou taille) pour ne contrôler en php que les fichiers qui seront réellement soumis 
    		par la classe javascript. Cette exclusion est indispensable pour interdire côté client le chargement de ces fichiers non valides, 
    		car "upabciErrorUser" sera possiblement modifié et remis à 0 dans la fonction "remplace" définie plus bas si l'on autorise le remplacement des fichiers déjà existants.
     
    		J'utilise le nom de l'input de type file pour créer l'objet. Permet d'avoir un code générique qui fonctionnerait également avec plusieurs champs de type file 
    		dans un même formulaire.
    		*/
    		controle_files[f.fichier.upabciInputName] = Array.isArray(controle_files[f.fichier.upabciInputName]) ? controle_files[f.fichier.upabciInputName] : [];
     
    		if(f.fichier.upabciErrorUser == 0)
    		{
    			controle_files[f.fichier.upabciInputName].push(f.fichier.name);
    		}
    	})
     
     
    	// Je sérialise le tableau de fichiers pour le passer en paramètre à la requête ajax de vérification des fichiers déjà existants
    	var query_fichiers = $.param(controle_files);
     
    	/* Je récupère le token du formulaire pour le passer en paramètre à la requête ajax de vérification des fichiers déjà existants. Il est disponible 
    	dans config.uniqidForm (cf. mode d'emploi section "Options de la classe Javascript", paragraphe "Liste des paramètres configurables"), cela m'évite 
    	de le rechercher dans le formulaire.
    	*/
    	var UpAbci_uniqidForm = Up.config.uniqidForm;
     
     
    	// Requête de vérification des fichiers déjà existants sur le serveur
    	$.ajax({
    		type: 'POST',
      		url: destination_ajax_verif_file,
      		data: {"UpAbci_uniqidForm":UpAbci_uniqidForm,"fichiers":query_fichiers},
    		dataType: "json",
    		beforeSend: function (xhr) 
    		{
    			/* Déclare la variable "verif_deferred" en attente de résolution pour bloquer la soumission des fichiers par l'intermédiaire de la méthode 
    			"Up.config.func_onFormSubmit()" utilisée par la suite.
    			*/
    			verif_deferred = $.Deferred();
     
    			// Annule la possibilité de sélectionner des fichiers
    			input_file.prop('disabled',true);
    		}
    	})
    	.done(function(reponse) 
    	{
    		// "reponse" renvoie soit un tableau de fichiers sous forme d'objet soit une chaine de caractères correspondant au message d'erreur.
    		if(typeof reponse != 'object')
    		{
    			info_server.html('<span style="color:red">'+reponse+'</span>').css('display','block');
    		}
    		else
    		{
    			var files_exist = [];
     
    			// On re liste le tableau javascript pour avoir une référence aux fichiers
    			$.each(tableau, function(i,f)
    			{
    				// Les fichiers testés déjà existants ont la valeur = 1, non existants = 0.
    				if(reponse[f.fichier.upabciInputName] && reponse[f.fichier.upabciInputName][f.fichier.name] == 1)
    				{
    					// On enregistre les fichiers déjà existants dans le tableau "files_exist" qui sera utilisé pour définir le comportement on click du checkbox
    					files_exist.push(f);
     
    					/* On redéfini le formatage et la propriété upabciErrorUser suivant la valeur initiale du chekbox qui autorise ou non le remplacement des fichiers, 
    					avec les fonction précédemment définies "remplace" et "noremplace"
    					*/
    					if(replacef.prop("checked"))
    					{
    						remplace(f);	
    					}
    					else
    					{
    						noremplace(f);	
    					}
    				}
    			})
     
     
    			// Permet d'inverser l'autorisation de remplacer ou non les fichiers, onclick sur le chekbox
    			replacef.on("click",function()
    			{
    				if($(this).prop("checked"))
    				{
    					$.each(files_exist, function(i,f)
    					{
    						remplace(f);
    					})
    				}
    				else 
    				{
    					$.each(files_exist, function(i,f)
    					{
    						noremplace(f);						
    					})						
    				}
    			})
     
     
    			/* 
    			Ne pas inverser l'ordre des lignes ci-dessous car la soumission du formulaire désactive automatiquement la possibilité de sélection des fichiers.
    			Ce fonctionnement automatique pourrait être corrompu si on inversait les deux lignes ci-dessous et si on cliquait sur le bouton de soumission du formulaire 
    			avant la fin de la requête de fichiers déjà existants (même si, pratiquement, c'est difficile à faire).
    			*/			
     
    			// Retabli la possibilité de sélectionner des fichiers
    			input_file.prop('disabled',false);
     
    			// Résolution de verif_deferred => témoin de fin de la requête de vérification des fichiers existants. 
    			verif_deferred.resolve();			
    		}		
    	})
    	.fail(function() 
    	{
    		// Si la requête échoue j'affiche un message dans le bloc ayant la classe ".UpAbci_infosServer"
    		info_server.html('<span style="color:red">Erreur dans la requête de vérification des fichiers existants.</span>').css('display','block');
    	})
     
     
    	/* 
    	Programmation de la boite javascript
    	*/
    	// Je ferme l'éventuel message sur la sauvegarde (si soumission multiples)
       	content.find(".backupend").css('display','none');
     
    	// slide de fermeture (slideUp) onclick sur le bouton de fermeture
    	fermer_formulaire.one("click", slideUp);
     
    	// Je ferme la boite au cas où elle serait ouverte (si soumission multiples) puis je l'ouvre
    	content.css('display','none').slideDown();
    }
     
     
    /* Définition d'une méthode javascript événementielle avec ".config.func_onFormSubmit" qui stoppe la soumission du formulaire. On déclenche son envoi avec 
    la méthode "func_SubmitForm()" si la requête de vérification des fichiers existants est terminée.
    */
    Up.config.func_onFormSubmit = function()
    {
    	if(verif_deferred)
    	{
    		$.when(verif_deferred).done(function()
    		{
    			Up.func_SubmitForm();
    		});
    	}
    }
     
     
    // Définition d'une méthode javascript événementielle avec ".config.func_FormSubmit" qui sera exécutée à la soumission du formulaire.
    Up.config.func_FormSubmit = function()
    {
    	/* Je désactive le checkbox d'autorisation de remplacement des fichier dès la soumission du formulaire. En effet les valeur des champs du formulaire sont enregistrées 
    	dès la soumission du formulaire (voir le fichier UploadAjaxABCI_Champs_Sup_Notation.php pour plus d'explications). Si le visiteur peut changer les valeurs durant 
    	le transfert des fichiers, il pourrait croire que son changement sera pris en compte alors que ce ne sera pas le cas. Je la réactiverai uniquement lors d'une prochaine 
    	sélection de fichiers dans func_FileSelectAll()
    	*/
    	replacef.prop('disabled',true);
     
    	// Durant l'upload je supprime la possibilité de fermeture pour que le visiteur puisse toujours voir les informations
    	fermer_formulaire.off("click");
     
    	// Je change le contenu de l'entête (.bouton_custom_file) en mettant "Traitement en cours..."
    	custom_select.text(custom_select_remplacement);
    }
     
     
    // Définition d'une méthode javascript événementielle qui sera exécutée à la fin du traitement du formulaire (option ".config.func_FormEnd")
    Up.config.func_FormEnd = function(tableau)
    {
    	/* Je désactive le checkbox d'autorisation de remplacement des fichier au cas où aucun fichier n'est soumis car dans ce cas on entre pas dans la 
    	méthode "func_FormSubmit". C'est juste pour avoir une apparence et des fonctionnalités (désactivées) cohérentes dans ce cas de figure.
    	*/
    	replacef.prop('disabled',true);
     
    	/* L'upload terminé je remet le comportement de fermeture sur le bouton de fermeture et sur le bouton d'information "Traitement terminé" défini dans le html 
    	avec ".fin_traitement"
       	*/
    	$.each([form.find(".fin_traitement"), fermer_formulaire], function()
    	{
    		$(this).one("click", slideUp)
    	}) 
     
       	// Je remet le texte initial 
       	custom_select.text(custom_select_texte);
     
    	/* Je compte le nombre de fichiers entièrement téléchargés ainsi que les fichiers traités et l'existence d'une sauvegarde, en utilisant des propriétés des objets 
    	(cf doc : "Options de la classe Javascript -> Contenu des objets spécifiques à chaque fichier"). Décommenter console.log(tableau) pour voir le contenu des tableaux 
    	dans la console du navigateur.
    	*/	
    	//console.log(tableau);
     
    	var ok = 0;
    	var traite = 0;
    	var sav = 0;
     
    	$.each(tableau, function(i,v)
    	{
    		if(v.result == 'ok_done'){
    			ok++;
    		}
    		else if(v.result != '0_0'){
    			traite++;
    		}
     
    		/* Le préfixe "backup" indique l'existence d'une sauvegarde et le suffixe "done" ou "fail" indique l'état de la requête. Pour un gros fichier qui nécessite 
    		plusieurs requêtes, une requête pourrait être défectueuse mais le fichier pourrait néanmoins avoir une sauvegarde réalisée lors des précédentes requêtes. 
    		Il faut donc tester ces deux résultats pour vérifier la présence d'une sauvegarde créée par le serveur.
    		*/
    		if(v.result == 'backup_done' || v.result == 'backup_fail'){
    			sav++
    		}
     
    		/*
    		Notez que la propriété "result" n'est renseigné qu'au retour de la requête serveur sinon sa valeur est '0_0'. Si je voulais tester l'existence d'une sauvegarde 
    		même si le fichier n'a pas été transmis au serveur, je pourrais tester la propriété "qte_save" qui est renseignée en continu, y compris dès la sélection du fichier 
    		si celui-ci dispose d'une sauvegarde précédente. Je pourrais donc faire :
     
    		if(v.qte_save > 0){
    			sav++
    		}
     
    		Mais dans cet exemple c'est redondant. D'une part parceque s'il on arrête le fichier avant l'envoi c'est que l'on ne veut pas le télécharger, et d'autre part ce 
    		message a déjà été affiché précédemment lors de la création de la sauvegarde.	
    		*/
    	})
     
    	/*
    	Pour avoir le nombre de fichiers sélectionnés qui n'ont pas été téléchargés avec succès on pourrait faire:
    	var fichiers_en_erreur_ou_non_soumis = tableau.length - ok;
    	*/
     
    	switch(ok)
    	{
    		/* Aucun fichier sélectionné n'a été soumis car erreur d'extension ou de taille (si vous avez configuré ces options), ou encore les fichiers ont été arrêtés 
    		avant l'envoi du formulaire.
    		*/
    		case 0 : if(traite == 0) {info_server.html('Aucun fichier traité')};break;
    		case 1 : info_server.html(ok+' '+'fichier téléchargé');break;
    		// test sur ok > 1 dans la case "default" car un fichier peut être en erreur côté serveur et dans ce cas il n'est pas téléchargé avec succès.
    		default : if(ok > 1) {info_server.html(ok+' '+'fichiers téléchargés')};
    	}
     
    	info_server.css('display','block');// Je fais afficher le bloc
     
    	if(sav > 0)
    	{
    		// Slide sur l'information de sauvegarde
    		content.find(".backupend").slideDown(300);
    	}
    }
     
    // Démarrage de la fonction d'upload
    Up.Start()});
    </script>
    	</body>
    </html>
    merci pour ton aide.

  9. #249
    Expert éminent sénior

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

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Citation Envoyé par kate59 Voir le message
    Bonjour,
    j'ai respecter ce que tu m'a dit j'utiliser l'ancienne version du code qui fonctionne bien il y' a quelques années maintenant je souhaite installer la nouvelle qui est génial bravo.

    Mais je me heurte à un message regulier :
    Connexion non valide ou perdue. Rafraîchissez la page et recharger éventuellement votre fichier, si celui-ci dispose d'une sauvegarde automatique elle sera utilisée.

    ainsi que identifiant de formulaire non valide en popup.

    J'ai remarque en fessant des test que en l'incluant dans mon codes es variable caché ne retourne pas d'id de mon coté.

    <input type="text" name="UpAbci_uniqidForm" value="<?=$UpAbci_uniqidForm?>">
    <input type="text" name="UpAbci_fragmentSize" value="<?=$UpAbci_fragmentSize?>">
    Le message régulier dont tu parles est précisément dû au fait que $UpAbci_uniqidForm n'est pas transmise côté serveur.

    Si tu fais afficher tout ton code html dans une chaine de caractère avec $body='...', il faut utiliser une autre syntaxe pour faire afficher les variables, par exemple value="'.$UpAbci_uniqidForm.'" à la place de value="<?=$UpAbci_uniqidForm?>" et de même pour "$UpAbci_fragmentSize". Cela suppose aussi bien entendu que ces variables soient définies préalablement comme dans les exemples de code.

    Ensuite concernant l'affichage du message d'alerte pour l'identifiant du formulaire non valide, effectivement si tu te trouves dans la condition "else" tu n'affiches jamais d'élément html ayant un id = "form_custom_verif", et la classe te dit qu'elle ne le trouve pas. Tu peux t'en tirer en rajoutant cet id dans n'importe quel élément html du code de ton "esle", par exemple $body.='<p class="error" id="form_custom_verif">...

    Fais attention dans la condition "else", apparemment la variable $body n'est pas définie donc "$body.=" n'est pas valide, sauf si tu a défini $body='' avant la première condition.

  10. #250
    Membre habitué
    Inscrit en
    Janvier 2008
    Messages
    1 159
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 1 159
    Points : 149
    Points
    149
    Par défaut
    Bonjour,
    merci pour ton retour.
    j'avais essayé pour les variables ta syntaxe mais cela ne change pas les codes erreurs sont toujours la avec tes indications et les input hidden toujours vide.
    J'ai remarque de plus que le panneau popup d'alerte apparait sur toutes les pages car baseadmin.php et utilisé sur toutes les pages.

    voici mon code complet si tu peux m'aider à adapter ton code pour que cela fonctionne ca serait super.

    mes pages de mon site sont composé du fichier baseadmin.php que voici inclu a la fin de chaque page :

    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
    <?php include('backups/header.inc.php');?>
    <body>
     
     
    <div id="header">
     
     
        </div>
     
        	<!-- fin header -->
    		<!-- debut page entiere -->	
    		 <div id="wrapper">
     
      <?php if($menu_gauche) { include("backups/navigation_gauche.php"); } ?>
     
      <!-- contenu de centre -->
       <div id="page-wrapper">
    	<div class="container-fluid">
    	<?php echo $body;?>
     
     
     
     
    			</div>
     
                 </div>
     
     
     
     
       <?php include('backups/footer.inc.php'); ?>
     
     
    </div>
     
    <script src="Javascript/jquery.js"></script>
    <script src="Javascript/UploadAjaxABCI.js"></script>
    <script>	
    "use strict"; // Vous pouvez supprimer cette ligne en cas d'utilisation d'autres scripts javascript qui ne supportent pas ce mode.
     
    $(function(){
     
    // Destination ajax de l'upload
    var destination_ajax_upload = 'Php_Upload/UploadAjaxABCI_Upload_Custom_VerifFileExist.php';
     
    // Destination ajax de la vérification des fichiers existants
    var destination_ajax_verif_file = 'Php_Upload/UploadAjaxABCI_VerifFileExist.php';
     
    var form = $("#form_custom_verif");
    var infos_form = form.find(".infos_form");
     
    var Up = new UploadAjaxABCI(destination_ajax_upload, form, infos_form);
     
    // Si vous faites un contrôle des extensions (recommandé), vous devez refaire ce même contrôle côté serveur par sécurité.
    //Up.config.filesExtensions = ['jpg','jpeg','png','gif','mp4','avi','mpg','m2ts','mkv','flv','mp3'];
     
    // Il conviendrait peut-être de baisser (ou mettre à zéro) la valeur ci-dessous pour les smartphones.
    Up.config.imgPreviewMaxSizeTotal = 500; // en Mo poids total maximum de toutes les photos. Au delà les vignettes ne seront pas affichées.
     
    /* (Les valeurs par défaut sont 90 et 60)
    En pixels, hauteur maximale de l'aperçu. Si vous modifier cette valeur faites de même dans le html pour le data-upabcicss-image-preview="height:70px".
    */
    Up.config.imgPreviewMaxHeight = 70;
     
    // En pixels, largeur maximale de l'aperçu. Si vous modifier cette valeur faites de même dans le html pour le data-upabcicss-image-preview="width:100px".
    Up.config.imgPreviewMaxWidth = 100; 
     
    // Option pour indiquer un élément html en remplacement du bouton de sélection des fichiers par défaut du navigateur.
    Up.config.customFileSelect = ".bouton_custom_file";
     
    // Durant le téléchargement des fichiers, applique ces effets sur le bouton d'envoi du formulaire.
    Up.config.cssSubmitOn = "cursor:wait;opacity:0.4";
     
    // Durant le téléchargement des fichiers, applique ces effets le bouton de sélection des fichiers.
    Up.config.cssFileSelectOn = "cursor:wait;opacity:0.7;color:#222";
     
    /* Il s'agit d'une boite spécifiquement dédiée à l'upload, j'interdis donc la soumission du formulaire si aucun fichier n'est soumis. 
    Economise une requête inutile si tous les fichiers sélectionnés ont été arrêtés avant l'envoi et que le formulaire est néanmoins soumis. 
    Voir "config.submitWithoutFileFuncFormEnd" à la ligne suivante qui indispensable dans cet exemple.
    */
    Up.config.submitWithoutFile = false;
     
    /* Si Upload.config.submitWithoutFile = false, l'option ci-dessous (cf mode d'emploi) permet néanmoins le déclenchement de la méthode 
    événementielle "config.func_FormEnd" dont j'ai besoin pour afficher le récapitulatif en fin de traitement du formulaire.
    */
    Up.config.submitWithoutFileFuncFormEnd = true;
     
     
    // Modification des messages par défaut de la classe javascript
    Up.info.status.inProgress = '<span style="color:green;font-style:italic">&nbsp;en cours...</span>';
    Up.info.status.stop = 'arrêt';
    /* Modification de la réponse textuelle du status si téléchargement ok. En mettant vide seules les informations envoyées par php en retour de requête ajax seront affichées. 
    C'est le rond vert défini avec la classe "symbol_result" qui témoignera du status ok.
    */
    Up.info.status.ok = ""; 
     
     
     
    // Définitions de variables nécessaires au script. 
    var content = form.find(".content")
    // Bouton case à cocher
    ,replacef = content.find("input[name=replace]")
    ,custom_select = form.find(Up.config.customFileSelect)
    ,custom_select_texte = custom_select.text()
    ,custom_select_remplacement = "Traitement en cours..."
    ,fermer_formulaire = $()
    ,info_server = $()
    ,verif_deferred = false
    ,slideUp = function(){content.slideUp(400)};
     
     
     
    // Définition d'une méthode javascript événementielle "config.func_FileSelectAll" qui sera exécutée à la sélection des fichiers.
    Up.config.func_FileSelectAll = function(event,tableau)
    {
    	/* Par sécurité je décoche l'autorisation de remplacement pour chaque nouvelle sélection de fichiers (ligne à supprimer si l'on veut conserver l'état 
    	du checkbox pour différentes sélections de fichier successives, ou si l'on veut indiquer l'attribut checked par défaut dans le html).
    	*/
    	replacef.prop('checked',false);
     
    	/* Je réactive le checkbox car je le désactive durant l'envoi des fichiers. Cette ligne peut être conservée dans tous les cas de figure et DOIT être conservée 
    	à moins de modifier également les méthodes func_FormSubmit et func_FormEnd).
    	*/
    	replacef.prop('disabled',false);
     
    	// J'enregistre le block d'information serveur qui servira plus loin et dans les méthodes suivantes
    	info_server = form.find(".UpAbci_infosServer");
     
    	// Le bouton de fermeture servira également plus loin et dans les méthodes suivantes
    	fermer_formulaire = form.find(".fermer_formulaire");
     
    	// L'input(s) de type file sera désactivé durant la requête de vérification des fichiers déjà existants
    	var input_file = form.find('input[type="file"]');
     
     
    	// Fontion pour définir les propriétés des fichiers et le formatage si l'on autorise le remplacement des fichiers existants
    	function remplace(f)
    	{
    		// Si le visiteur n'a pas choisi d'arrêter son fichier (f.stop = 0)
    		if(f.stop === 0)
    		{
    			// Affecte la valeur 0 à la propriété interne d'erreur du fichier pour permettre son transfert.
    			f.fichier.upabciErrorUser = 0;
     
    			// J'envoie un message dans le bloc du status d'information
    			f.upAbci.status.html('<span style="color:red">Le fichier existant sera remplacé</span>').css('display','inline-block');
     
    			// Je cache le rond rouge
    			f.infosFile.find(".file_exist").css('display','none');
    		}
    	}
     
     
    	// Fontion pour définir les propriétés des fichiers et le formatage si l'on autorise PAS le remplacement des fichiers existants
    	function noremplace(f)
    	{
    		// Si le visiteur n'a pas choisi d'arrêter son fichier (f.stop = 0)
    		if(f.stop === 0)
    		{
    			// Affecte la valeur 1 à la propriété interne d'erreur du fichier pour interdire son transfert.
    			f.fichier.upabciErrorUser = 1;
     
    			// J'envoie un message dans le bloc du status d'information
    			f.upAbci.status.html('<span style="color:red">Ce fichier existe déjà</span>').css('display','inline-block');
     
    			// Je fais afficher le rond rouge
    			f.infosFile.find(".file_exist").css('display','block');
    		}
    	}
     
     
    	// Initialise le tableau des fichiers sélectionnés qui sera passé côté serveur pour vérification des fichiers déjà existants.
    	var controle_files = {};
     
    	/* Il y a un tableau d'objets par fichier
    	Cf mode d'emploi section "Options de la classe Javascript", paragraphe "Contenu des objets spécifiques à chaque fichier", et faire console.log(tableau) 
    	pour comprendre l'exploitation des propriétés des objets.
    	//console.log(tableau);
    	*/
    	$.each(tableau, function(i,f)
    	{
    		/* Je contruis un objet (controle_files) qui sera envoyé vers le serveur pour contrôler l'existence des fichiers avant la soumission du formulaire.  
     
    		La propriété "fichier.upabciErrorUser" comptabilise les erreurs utilisateur d'extension et/ou de taille de fichier si on a utilisé les options de 
    		configuration "config.filesExtensions" et/ou "config.fileSizeMax". Si la valeur de "fichier.upabciErrorUser" est supérieure à zéro le fichier 
    		ne sera pas soumis au serveur par la classe javascript.
     
    		J'exclus  donc ces fichiers ayant une erreur utilisateur (extension ou taille) pour ne contrôler en php que les fichiers qui seront réellement soumis 
    		par la classe javascript. Cette exclusion est indispensable pour interdire côté client le chargement de ces fichiers non valides, 
    		car "upabciErrorUser" sera possiblement modifié et remis à 0 dans la fonction "remplace" définie plus bas si l'on autorise le remplacement des fichiers déjà existants.
     
    		J'utilise le nom de l'input de type file pour créer l'objet. Permet d'avoir un code générique qui fonctionnerait également avec plusieurs champs de type file 
    		dans un même formulaire.
    		*/
    		controle_files[f.fichier.upabciInputName] = Array.isArray(controle_files[f.fichier.upabciInputName]) ? controle_files[f.fichier.upabciInputName] : [];
     
    		if(f.fichier.upabciErrorUser == 0)
    		{
    			controle_files[f.fichier.upabciInputName].push(f.fichier.name);
    		}
    	})
     
     
    	// Je sérialise le tableau de fichiers pour le passer en paramètre à la requête ajax de vérification des fichiers déjà existants
    	var query_fichiers = $.param(controle_files);
     
    	/* Je récupère le token du formulaire pour le passer en paramètre à la requête ajax de vérification des fichiers déjà existants. Il est disponible 
    	dans config.uniqidForm (cf. mode d'emploi section "Options de la classe Javascript", paragraphe "Liste des paramètres configurables"), cela m'évite 
    	de le rechercher dans le formulaire.
    	*/
    	var UpAbci_uniqidForm = Up.config.uniqidForm;
     
     
    	// Requête de vérification des fichiers déjà existants sur le serveur
    	$.ajax({
    		type: 'POST',
      		url: destination_ajax_verif_file,
      		data: {"UpAbci_uniqidForm":UpAbci_uniqidForm,"fichiers":query_fichiers},
    		dataType: "json",
    		beforeSend: function (xhr) 
    		{
    			/* Déclare la variable "verif_deferred" en attente de résolution pour bloquer la soumission des fichiers par l'intermédiaire de la méthode 
    			"Up.config.func_onFormSubmit()" utilisée par la suite.
    			*/
    			verif_deferred = $.Deferred();
     
    			// Annule la possibilité de sélectionner des fichiers
    			input_file.prop('disabled',true);
    		}
    	})
    	.done(function(reponse) 
    	{
    		// "reponse" renvoie soit un tableau de fichiers sous forme d'objet soit une chaine de caractères correspondant au message d'erreur.
    		if(typeof reponse != 'object')
    		{
    			info_server.html('<span style="color:red">'+reponse+'</span>').css('display','block');
    		}
    		else
    		{
    			var files_exist = [];
     
    			// On re liste le tableau javascript pour avoir une référence aux fichiers
    			$.each(tableau, function(i,f)
    			{
    				// Les fichiers testés déjà existants ont la valeur = 1, non existants = 0.
    				if(reponse[f.fichier.upabciInputName] && reponse[f.fichier.upabciInputName][f.fichier.name] == 1)
    				{
    					// On enregistre les fichiers déjà existants dans le tableau "files_exist" qui sera utilisé pour définir le comportement on click du checkbox
    					files_exist.push(f);
     
    					/* On redéfini le formatage et la propriété upabciErrorUser suivant la valeur initiale du chekbox qui autorise ou non le remplacement des fichiers, 
    					avec les fonction précédemment définies "remplace" et "noremplace"
    					*/
    					if(replacef.prop("checked"))
    					{
    						remplace(f);	
    					}
    					else
    					{
    						noremplace(f);	
    					}
    				}
    			})
     
     
    			// Permet d'inverser l'autorisation de remplacer ou non les fichiers, onclick sur le chekbox
    			replacef.on("click",function()
    			{
    				if($(this).prop("checked"))
    				{
    					$.each(files_exist, function(i,f)
    					{
    						remplace(f);
    					})
    				}
    				else 
    				{
    					$.each(files_exist, function(i,f)
    					{
    						noremplace(f);						
    					})						
    				}
    			})
     
     
    			/* 
    			Ne pas inverser l'ordre des lignes ci-dessous car la soumission du formulaire désactive automatiquement la possibilité de sélection des fichiers.
    			Ce fonctionnement automatique pourrait être corrompu si on inversait les deux lignes ci-dessous et si on cliquait sur le bouton de soumission du formulaire 
    			avant la fin de la requête de fichiers déjà existants (même si, pratiquement, c'est difficile à faire).
    			*/			
     
    			// Retabli la possibilité de sélectionner des fichiers
    			input_file.prop('disabled',false);
     
    			// Résolution de verif_deferred => témoin de fin de la requête de vérification des fichiers existants. 
    			verif_deferred.resolve();			
    		}		
    	})
    	.fail(function() 
    	{
    		// Si la requête échoue j'affiche un message dans le bloc ayant la classe ".UpAbci_infosServer"
    		info_server.html('<span style="color:red">Erreur dans la requête de vérification des fichiers existants.</span>').css('display','block');
    	})
     
     
    	/* 
    	Programmation de la boite javascript
    	*/
    	// Je ferme l'éventuel message sur la sauvegarde (si soumission multiples)
       	content.find(".backupend").css('display','none');
     
    	// slide de fermeture (slideUp) onclick sur le bouton de fermeture
    	fermer_formulaire.one("click", slideUp);
     
    	// Je ferme la boite au cas où elle serait ouverte (si soumission multiples) puis je l'ouvre
    	content.css('display','none').slideDown();
    }
     
     
    /* Définition d'une méthode javascript événementielle avec ".config.func_onFormSubmit" qui stoppe la soumission du formulaire. On déclenche son envoi avec 
    la méthode "func_SubmitForm()" si la requête de vérification des fichiers existants est terminée.
    */
    Up.config.func_onFormSubmit = function()
    {
    	if(verif_deferred)
    	{
    		$.when(verif_deferred).done(function()
    		{
    			Up.func_SubmitForm();
    		});
    	}
    }
     
     
    // Définition d'une méthode javascript événementielle avec ".config.func_FormSubmit" qui sera exécutée à la soumission du formulaire.
    Up.config.func_FormSubmit = function()
    {
    	/* Je désactive le checkbox d'autorisation de remplacement des fichier dès la soumission du formulaire. En effet les valeur des champs du formulaire sont enregistrées 
    	dès la soumission du formulaire (voir le fichier UploadAjaxABCI_Champs_Sup_Notation.php pour plus d'explications). Si le visiteur peut changer les valeurs durant 
    	le transfert des fichiers, il pourrait croire que son changement sera pris en compte alors que ce ne sera pas le cas. Je la réactiverai uniquement lors d'une prochaine 
    	sélection de fichiers dans func_FileSelectAll()
    	*/
    	replacef.prop('disabled',true);
     
    	// Durant l'upload je supprime la possibilité de fermeture pour que le visiteur puisse toujours voir les informations
    	fermer_formulaire.off("click");
     
    	// Je change le contenu de l'entête (.bouton_custom_file) en mettant "Traitement en cours..."
    	custom_select.text(custom_select_remplacement);
    }
     
     
    // Définition d'une méthode javascript événementielle qui sera exécutée à la fin du traitement du formulaire (option ".config.func_FormEnd")
    Up.config.func_FormEnd = function(tableau)
    {
    	/* Je désactive le checkbox d'autorisation de remplacement des fichier au cas où aucun fichier n'est soumis car dans ce cas on entre pas dans la 
    	méthode "func_FormSubmit". C'est juste pour avoir une apparence et des fonctionnalités (désactivées) cohérentes dans ce cas de figure.
    	*/
    	replacef.prop('disabled',true);
     
    	/* L'upload terminé je remet le comportement de fermeture sur le bouton de fermeture et sur le bouton d'information "Traitement terminé" défini dans le html 
    	avec ".fin_traitement"
       	*/
    	$.each([form.find(".fin_traitement"), fermer_formulaire], function()
    	{
    		$(this).one("click", slideUp)
    	}) 
     
       	// Je remet le texte initial 
       	custom_select.text(custom_select_texte);
     
    	/* Je compte le nombre de fichiers entièrement téléchargés ainsi que les fichiers traités et l'existence d'une sauvegarde, en utilisant des propriétés des objets 
    	(cf doc : "Options de la classe Javascript -> Contenu des objets spécifiques à chaque fichier"). Décommenter console.log(tableau) pour voir le contenu des tableaux 
    	dans la console du navigateur.
    	*/	
    	//console.log(tableau);
     
    	var ok = 0;
    	var traite = 0;
    	var sav = 0;
     
    	$.each(tableau, function(i,v)
    	{
    		if(v.result == 'ok_done'){
    			ok++;
    		}
    		else if(v.result != '0_0'){
    			traite++;
    		}
     
    		/* Le préfixe "backup" indique l'existence d'une sauvegarde et le suffixe "done" ou "fail" indique l'état de la requête. Pour un gros fichier qui nécessite 
    		plusieurs requêtes, une requête pourrait être défectueuse mais le fichier pourrait néanmoins avoir une sauvegarde réalisée lors des précédentes requêtes. 
    		Il faut donc tester ces deux résultats pour vérifier la présence d'une sauvegarde créée par le serveur.
    		*/
    		if(v.result == 'backup_done' || v.result == 'backup_fail'){
    			sav++
    		}
     
    		/*
    		Notez que la propriété "result" n'est renseigné qu'au retour de la requête serveur sinon sa valeur est '0_0'. Si je voulais tester l'existence d'une sauvegarde 
    		même si le fichier n'a pas été transmis au serveur, je pourrais tester la propriété "qte_save" qui est renseignée en continu, y compris dès la sélection du fichier 
    		si celui-ci dispose d'une sauvegarde précédente. Je pourrais donc faire :
     
    		if(v.qte_save > 0){
    			sav++
    		}
     
    		Mais dans cet exemple c'est redondant. D'une part parceque s'il on arrête le fichier avant l'envoi c'est que l'on ne veut pas le télécharger, et d'autre part ce 
    		message a déjà été affiché précédemment lors de la création de la sauvegarde.	
    		*/
    	})
     
    	/*
    	Pour avoir le nombre de fichiers sélectionnés qui n'ont pas été téléchargés avec succès on pourrait faire:
    	var fichiers_en_erreur_ou_non_soumis = tableau.length - ok;
    	*/
     
    	switch(ok)
    	{
    		/* Aucun fichier sélectionné n'a été soumis car erreur d'extension ou de taille (si vous avez configuré ces options), ou encore les fichiers ont été arrêtés 
    		avant l'envoi du formulaire.
    		*/
    		case 0 : if(traite == 0) {info_server.html('Aucun fichier traité')};break;
    		case 1 : info_server.html(ok+' '+'fichier téléchargé');break;
    		// test sur ok > 1 dans la case "default" car un fichier peut être en erreur côté serveur et dans ce cas il n'est pas téléchargé avec succès.
    		default : if(ok > 1) {info_server.html(ok+' '+'fichiers téléchargés')};
    	}
     
    	info_server.css('display','block');// Je fais afficher le bloc
     
    	if(sav > 0)
    	{
    		// Slide sur l'information de sauvegarde
    		content.find(".backupend").slideDown(300);
    	}
    }
     
    // Démarrage de la fonction d'upload
    Up.Start()});
    </script>
    	</body>
    </html>
    et du fichier config.php en haut de chaque page :

    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
    <?php
    session_start(); // On appelle session_start() APRÈS avoir enregistré l'autoload
    //error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);
    define("RACINE","https://xxxxxxxxx/");
    define("RACINE_BACKEND","https://xxxxxxxxxxx/backend/");
     
     
    require 'backups/autoload.inc.php';
     
        $db = DBFactory::getMysqlConnexionWithPDO();
     
    if (isset($_GET['deconnexion']))
    {
    	session_destroy();
    	header('Location:../index.php');
    	exit();
    }
     
    ?>


    ainsi que le fichier header qui est appelé dans le fichier baseadmin:

    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
    <?php
    /*
     
    Utilise le fichier "Php_Upload/UploadAjaxABCI_Upload_Custom.php" comme destination ajax
     
    -------------------------------------------------------- 
    */
    session_start();
    header('Content-type: text/html; charset=UTF-8');// Inutile depuis php 5.6
     
    // Charge les classes php avec spl_autoload_register
    spl_autoload_register(function ($class) {require 'Php_Upload/Classes/' . $class . '.php';});
     
    $up = new UploadABCIServices();
     
    $UpAbci_fragmentSize = $up->returnOctets('8M'); 
     
    // Vérifie si $UpAbci_fragmentSize n'est pas supérieur aux limites du serveur
    $upload_max_filesize = min($up->returnOctets(ini_get('upload_max_filesize')), $up->returnOctets(ini_get('post_max_size')));$UpAbci_fragmentSize = !empty($UpAbci_fragmentSize) && $upload_max_filesize > $UpAbci_fragmentSize ? $UpAbci_fragmentSize : $upload_max_filesize;
    $UpAbci_uniqidForm = $up->getUniqid();
     
    // Jeton de formulaire
    $_SESSION['UploadAjaxABCI'][$UpAbci_uniqidForm]['token'] = 1;
     
    // Optionnel: fonction de nettoyage du dossier temporaire (cf mode d'emploi rubrique "Mise en production, notes" ->Technique d'upload, maintenance).
    NettoyageTemp::interval();
    ?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">
     
    	<head>
    		<title></title>
    		<meta http-equiv="content-type" content="text/html;  charset=utf-8" />
    		<meta name="description" content="<?php echo $description; ?>" />
    		<meta name="keywords" content="<?php echo $keywords; ?>" />
    		<meta name="subject" content="<?php echo $subject; ?>" />
    		<meta name="author" content="achat-en-folie" />
    		<meta name="revisit-after" content="1 days" />
    		<meta name="robots" content="index, follow, imageindex, imageclick" />
    		<meta name="sitename" content="" />
    		<link href="<?php echo RACINE_BACKEND ?>css/style.css" type="text/css" rel="stylesheet" />
     
     
     
     
        <!-- Bootstrap Core CSS -->
        <link href="<?php echo RACINE_BACKEND ?>css/bootstrap.min.css" rel="stylesheet">
     
        <!-- Custom CSS -->
        <link href="<?php echo RACINE_BACKEND ?>css/sb-admin.css" rel="stylesheet">
     
        <!-- Morris Charts CSS -->
        <link href="<?php echo RACINE_BACKEND ?>css/plugins/morris.css" rel="stylesheet">
     
        <!-- Custom Fonts -->
        <link href="<?php echo RACINE_BACKEND ?>font-awesome/css/font-awesome.min.css" rel="stylesheet" type="text/css">
     
     
     
    <link rel="stylesheet" href="css/print.css" type="text/css" media="print" />
     
     
     
    <style>
    #form_custom_verif {
    	font-family:Arial, Helvetica, sans-serif; 
    	font-size:1em;
    	max-width:550px;
    	margin:2em auto 2em auto;	
    	border:3px solid #f3f3f3;
    	border-radius:5px;
    	box-shadow: 0px 0px 2px 1px rgba(100, 100, 100, 0.8);
    	overflow:hidden;
    }
     
    #form_custom_verif p {
    	margin:0;
    	padding:0;
    }
     
    #form_custom_verif input[type=file] {
    	display:none !important;
    }
     
    #form_custom_verif .bouton_custom_file {
    	font-size:1.1em;
    	width:auto;
    	min-height:1.8em;
    	padding:0.9em 0 0.15em 0;
    	text-align:center;
    	background:#f3f3f3;
    	border:none;
    	cursor:pointer;
    }
     
    #form_custom_verif .content {
    	display:none;
    	border:1px solid #b5b5b5;
    }
     
    #form_custom_verif .replace {
    	padding:0.5em;
    	border-bottom:1px solid #ccc;
    	font-size:0.8em;
    	background:#f9f9f9
    }
     
    #form_custom_verif .infos_form {
    	font-size:0.8em;
    	margin:0 auto;
    	padding:0 1.2em 1em 1.5em;
    }
     
    #form_custom_verif .UpAbci_infosFile {
    	margin:0.25em 0 0.1em 0;
    	border-bottom:1px solid #e2e2e2;
    	padding:0;
    	word-wrap:break-word;
    }
     
    #form_custom_verif .UpAbci_infosFile progress {
    	height:0.8em;
    	width:15%;
    	padding:0;
    	margin:0;
    	display:none;
    	vertical-align:baseline;
    }
     
    #form_custom_verif .UpAbci_imgPreview {
    	position:relative;
    	height:100%;
    }
     
    #form_custom_verif .UpAbci_imgPreview img {
    	position:absolute;
    	bottom:0px;
    }
     
    #form_custom_verif input[type=button]:not(.fin_traitement) {
    	background:#F3F3F3;
    	box-shadow:inset 0px 0px 1px 0px #ddd;
    	border:1px solid #BFBFBF;
    	border-radius:3px;
    	cursor:pointer;
    	color: black;
    	padding:0;
    	font-size:0.8em;
    }
     
    #form_custom_verif .arret {
    	height:1.9em;
    	letter-spacing:0.10em;
    }
     
    #form_custom_verif .submit {
    	height:30px;
    	box-shadow:inset 0px 0px 3px 0px #ddd;
    	border:1px solid #BFBFBF;
    	border-radius:3px;
    	cursor:pointer;
    	background:#F3F3F3;
    	margin:auto;
    }
     
    #form_custom_verif .symbol_result {
    	font-family: Arial, Helvetica, sans-serif;
    	font-size:13px;
    	border-radius: 50%;
    	height: 1.45em;
    	width: 1.45em;
    	text-align:center;
    	font-weight: bold;
    	box-shadow:inset 0px 0px 1px 0px #999;
    	margin-top:0.5em;
    	color: #fff;
    	display:none;
    	position:absolute;
    	top:0;
    	right:0;
    	background: #0C0;
    }
     
    #form_custom_verif .symbol_result.file_exist {
    	background: #F30;
    }
     
    #form_custom_verif .symbol_result.sauvegarde {
    	background-color:#FC0;
    }
     
    h3 {
    	font-family:Arial, Helvetica, sans-serif;
    	font-size:1.5em;
    	color:#666;
    	margin:2em auto 1em auto;
    }
    </style>
    	</head>
    Voici donc la page de test créer avec ton code :

    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
     
    <?php
    include('backups/config.inc.php');
     
    $menu_gauche = false;
     
    // la session est bien active, et la personne est bien connectée ...
    if((isset($_SESSION['email'])) && ($_SESSION['email'] != ''))
    {
     
    $body='
    <body>
    <h3 style="max-width:800px;">
    Exemple customisé avec vérification avant upload
    </h3>
    <form id = "form_custom_verif" action = "#" method = "post">
     
         <input type="file" multiple="multiple" name="upload">
         <input type="text" name="UpAbci_uniqidForm" value="'.$UpAbci_uniqidForm.'">
         <input type="text" name="UpAbci_fragmentSize" value="'.$UpAbci_fragmentSize.'">
     
    	<p class="bouton_custom_file">Cliquez ou déposez vos fichiers ici</p>
     
     
        <div class="content">
            <p class="replace">
     
            <label style="cursor:pointer"><input type="checkbox" name="replace">&nbsp;Autoriser le remplacement des fichiers existants</label>
            </p>
            <div class="infos_form">                            
                <div class="UpAbci_infosFile">
     
                    <div style="position:relative;padding-bottom:0.35em" data-upabcicss-image-preview="height:70px">
     
     
                        <span style="display:inline-block" class="UpAbci_imgPreview" data-upabcicss-image-preview="width:100px"></span>
     
     
                        <progress class="UpAbci_progressionG" data-upabcicss-in-progress="display:inline" data-upabcicss-result="display:none" data-upabcicss-result-partial="display:inline" data-upabcicss-backup="display:inline"></progress>
     
     
                        <span style="display:none" data-upabcicss-result-partial="display:inline;color:#916C00"> sauvegardé : </span><span class="UpAbci_backup" style="display:none" data-upabcicss-result-partial="display:inline"></span>
     
     
                        <span style="display:none" data-upabcicss-remaining-time-after="display:inline" data-upabcicss-result="display:none"> temps restant : </span><span class="UpAbci_remainingTime" style="display:none" data-upabcicss-remaining-time-after="display:inline" data-upabcicss-result="display:none"> - </span>
     
     
                        <span class="symbol_result" data-upabcicss-result-ok="display:block">&#x2713;</span> 
     
     
                        <span class="symbol_result file_exist" data-upabcicss-result-stop="display:block" data-upabcicss-result-error="display:block" data-upabcicss-result-partial="display:none">x</span>
     
     
                        <span class="symbol_result sauvegarde" data-upabcicss-result-partial="display:block">&#x2758;&#x2758;</span>     
                    </div>
     
                    <div style="padding-bottom:0.3em;min-height:2.8em">
                        <input type="button" class="UpAbci_stop arret" style="width:4em;" data-upabcicss-result="cursor:default;opacity:0.4" value="arrêt">
     
     
                        <span class="UpAbci_name"></span>
     
     
                        <span class="UpAbci_size">0Mo</span>
     
     
     
                        <p class="UpAbci_status" style="display:none" data-upabcicss-in-progress="display:inline-block" data-upabcicss-result-stop="color:red;display:inline-block" data-upabcicss-result-error="color:red;display:inline-block" data-upabcicss-result-ok="color:#916C00;display:block;font-size:0.9em"></p>     
                    </div>
                  </div>
                  <div style="margin-top:1.5em;min-height:4.7em;">
                      <div>
     
                        <input type="button" value="Arrêter tout" class="UpAbci_stopAll arret" style="float:left;width:75px" data-upabcicss-form-end="cursor:default;opacity:0.4">
     
     
                        <input type="button" value="Fermer" class="fermer_formulaire arret" style="float:right;width:55px" data-upabcicss-submit="cursor:default;opacity:0.4" data-upabcicss-form-end="cursor:pointer;opacity:1">
     
     
                        <input type="submit" class="submit" value="Envoyer" style="width:125px;font-size:1.2em;display:block;margin:auto;" data-upabcicss-form-end="display:none">
     
     
                        <input type="button" class="submit fin_traitement" style="width:125px;font-size:0.9em;display:none;margin:auto" data-upabcicss-form-end="display:block" value = "Traitement terminé">         
                      </div>
     
     
    				  <div class="UpAbci_infosServer" style="display:none;clear:both;font-size:1.3em;margin-top:0.5em;" data-upabcicss-infos-server="display:block"></div>
                </div>
            </div>
     
     
            <div class = "backupend" style="display:none;padding:0.5em;font-size:0.7em;background:#FC0">
            <span style="color:#fff;font-size:13px">&#x2759;&#x2759;&nbsp;&nbsp;</span>Les fichiers partiellement sauvegardés peuvent être complétés pendant 24h.
            </div> 
     
        </div>
     
    </form>';
     
     
    }
    else
    {
     
    	$body.='<p class="error" id="form_custom_verif">D&eacute;sol&eacute;, vos informations personnels transmis &agrave; cette page sont incorrects.<br /><br />
    			<a href="index.php">Cliquez ici pour revenir &agrave; la page pr&eacute;cedente</a></p>
    			';
     
    }
     
    include('backups/baseAdmin.php');
    ?>
    n'hesite pas si tu a besoin d'autres fichiers car le je ne vois pas ce qui bloque je pensais au session start peut etre ?

    MERCI POUR ton aide.

  11. #251
    Expert éminent sénior

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

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Dans config.php, fais afficher les erreurs :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    session_start(); 
    error_reporting(E_ALL);
    ini_set('display_errors', 1);
    define("RACINE","https://xxxxxxxxx/");
    define("RACINE_BACKEND","https://xxxxxxxxxxx/backend/");
    ...

    Fais attention, il ne faut qu'un seul "session_start()" dans ta page, donc s'il est déclaré ici, il ne doit pas l'être dans tes autres scripts.

    Remplaces l'autoload :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // Charge les classes php avec spl_autoload_register
    spl_autoload_register(function ($class) {require 'Php_Upload/Classes/' . $class . '.php';});
    par
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // Charge les classes php avec spl_autoload_register
    spl_autoload_register(function ($class) {if(file_exists('Php_Upload/Classes/' . $class . '.php')) require 'Php_Upload/Classes/' . $class . '.php';});


    Ton doctype est obsolète, remplaces
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">
    par
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <!DOCTYPE html>
    <html lang="fr">

    Php affiche-t-il des erreurs maintenant, si oui corriges-les.

    Quand ta page est affichée, fais un "ctrl+u" (touches clavier) pour faire afficher le html généré et regardes si ta page est bien structurée. Tu peux aussi enregistré le html généré dans une page distincte et la passer au validateur w3c

    Concernant le passage des variables php mets toi en mode debug, c'est à dire fais afficher tes variables var_dump($UpAbci_uniqidForm);exit; à certains endroits du script pour voir là où ça passe et là où cela ne passe pas.

    Concernant le javascript, tu peux ne faire afficher le script d'upload que lorsqu'il est nécessaire
    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
    <?php if($cpondision) {
    ?>
    <script src="Javascript/jquery.js"></script>
    <script src="Javascript/UploadAjaxABCI.js"></script>
    <script>	
    "use strict"; // Vous pouvez supprimer cette ligne en cas d'utilisation d'autres scripts javascript qui ne supportent pas ce mode.
     
    $(function(){
     
    // Destination ajax de l'upload
    var destination_ajax_upload = 'Php_Upload/UploadAjaxABCI_Upload_Custom_VerifFileExist.php';
     
    //...
     
    // Démarrage de la fonction d'upload
    Up.Start()});
    </script>
    <?php } ?>
     
    </body>
    </html>

  12. #252
    Membre habitué
    Inscrit en
    Janvier 2008
    Messages
    1 159
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 1 159
    Points : 149
    Points
    149
    Par défaut
    bonsoir,

    merci pour ces conseils !

    j'ai fais les 1ères modifications mais cela ne m'aide pas trop c'est bien ce que je confirmais les variables sont vides :


    Notice: Undefined variable: UpAbci_uniqidForm in /homepages/4/d602692378/htdocs/sitehtml2020/HTML/backend/test.php on line 18

    Notice: Undefined variable: UpAbci_fragmentSize in /homepages/4/d602692378/htdocs/sitehtml2020/HTML/backend/test.php on line 19

    Notice: session_start(): A session had already been started - ignoring in /homepages/4/d602692378/htdocs/sitehtml2020/HTML/backend/backups/header.inc.php on line 8

    Warning: Cannot modify header information - headers already sent by (output started at /homepages/4/d602692378/htdocs/sitehtml2020/HTML/backend/test.php:18) in /homepages/4/d602692378/htdocs/sitehtml2020/HTML/backend/backups/header.inc.php on line 9
    Je sais que j'ai bien de session star un dans header le nouveau avec ton code et un dans config que j'avais deja avant.

    Est-ce que c'est cela le problème?
    J'ai changé l'autoload aussi que tu as transmis et le doctype.

    j'ai enlevé la session start dans header car il y est déjà dans le fichier config voici le message d'erreur :

    Notice: Undefined variable: UpAbci_uniqidForm in /homepages/4/d602692378/htdocs/sitehtml2020/HTML/backend/test.php on line 18

    Notice: Undefined variable: UpAbci_fragmentSize in /homepages/4/d602692378/htdocs/sitehtml2020/HTML/backend/test.php on line 19

    Warning: Cannot modify header information - headers already sent by (output started at /homepages/4/d602692378/htdocs/sitehtml2020/HTML/backend/test.php:18) in /homepages/4/d602692378/htdocs/sitehtml2020/HTML/backend/backups/header.inc.php on line 9
    voici le html généré :

    Code HTML : 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
    <!DOCTYPE html>
    <html lang="fr">
     
     
    	<head>
    		<title></title>
    		<meta http-equiv="content-type" content="text/html;  charset=utf-8" />
    		<meta name="description" content="<br />
    <b>Notice</b>:  Undefined variable: description in <b>/homepages/4/d602692378/htdocs/sitehtml2020/HTML/backend/backups/header.inc.php</b> on line <b>35</b><br />
    " />
    		<meta name="keywords" content="<br />
    <b>Notice</b>:  Undefined variable: keywords in <b>/homepages/4/d602692378/htdocs/sitehtml2020/HTML/backend/backups/header.inc.php</b> on line <b>36</b><br />
    " />
    		<meta name="subject" content="<br />
    <b>Notice</b>:  Undefined variable: subject in <b>/homepages/4/d602692378/htdocs/sitehtml2020/HTML/backend/backups/header.inc.php</b> on line <b>37</b><br />
    " />
    		<meta name="author" content="achat-en-folie" />
    		<meta name="revisit-after" content="1 days" />
    		<meta name="robots" content="index, follow, imageindex, imageclick" />
    		<meta name="sitename" content="" />
    		<link href="xxxxxx/css/style.css" type="text/css" rel="stylesheet" />
     
     
     
     
     
    <link rel="stylesheet" href="css/print.css" type="text/css" media="print" />
     
     
     
    <style>
    #form_custom_verif {
            font-family:Arial, Helvetica, sans-serif; 
            font-size:1em;
            max-width:550px;
            margin:2em auto 2em auto;       
            border:3px solid #f3f3f3;
            border-radius:5px;
            box-shadow: 0px 0px 2px 1px rgba(100, 100, 100, 0.8);
            overflow:hidden;
    }
     
    #form_custom_verif p {
            margin:0;
            padding:0;
    }
     
    #form_custom_verif input[type=file] {
            display:none !important;
    }
     
    #form_custom_verif .bouton_custom_file {
            font-size:1.1em;
            width:auto;
            min-height:1.8em;
            padding:0.9em 0 0.15em 0;
            text-align:center;
            background:#f3f3f3;
            border:none;
            cursor:pointer;
    }
     
    #form_custom_verif .content {
            display:none;
            border:1px solid #b5b5b5;
    }
     
    #form_custom_verif .replace {
            padding:0.5em;
            border-bottom:1px solid #ccc;
            font-size:0.8em;
            background:#f9f9f9
    }
     
    #form_custom_verif .infos_form {
            font-size:0.8em;
            margin:0 auto;
            padding:0 1.2em 1em 1.5em;
    }
     
    #form_custom_verif .UpAbci_infosFile {
            margin:0.25em 0 0.1em 0;
            border-bottom:1px solid #e2e2e2;
            padding:0;
            word-wrap:break-word;
    }
     
    #form_custom_verif .UpAbci_infosFile progress {
            height:0.8em;
            width:15%;
            padding:0;
            margin:0;
            display:none;
            vertical-align:baseline;
    }
     
    #form_custom_verif .UpAbci_imgPreview {
            position:relative;
            height:100%;
    }
     
    #form_custom_verif .UpAbci_imgPreview img {
            position:absolute;
            bottom:0px;
    }
     
    #form_custom_verif input[type=button]:not(.fin_traitement) {
            background:#F3F3F3;
            box-shadow:inset 0px 0px 1px 0px #ddd;
            border:1px solid #BFBFBF;
            border-radius:3px;
            cursor:pointer;
            color: black;
            padding:0;
            font-size:0.8em;
    }
     
    #form_custom_verif .arret {
            height:1.9em;
            letter-spacing:0.10em;
    }
     
    #form_custom_verif .submit {
            height:30px;
            box-shadow:inset 0px 0px 3px 0px #ddd;
            border:1px solid #BFBFBF;
            border-radius:3px;
            cursor:pointer;
            background:#F3F3F3;
            margin:auto;
    }
     
    #form_custom_verif .symbol_result {
            font-family: Arial, Helvetica, sans-serif;
            font-size:13px;
            border-radius: 50%;
            height: 1.45em;
            width: 1.45em;
            text-align:center;
            font-weight: bold;
            box-shadow:inset 0px 0px 1px 0px #999;
            margin-top:0.5em;
            color: #fff;
            display:none;
            position:absolute;
            top:0;
            right:0;
            background: #0C0;
    }
     
    #form_custom_verif .symbol_result.file_exist {
            background: #F30;
    }
     
    #form_custom_verif .symbol_result.sauvegarde {
            background-color:#FC0;
    }
     
    h3 {
            font-family:Arial, Helvetica, sans-serif;
            font-size:1.5em;
            color:#666;
            margin:2em auto 1em auto;
    }
    </style>
    	</head><body>
     
     
    <div id="header">
     
     
        </div>
     
        	<!-- fin header -->
    		<!-- debut page entiere -->	
    		 <div id="wrapper">
     
     
      <!-- contenu de centre -->
       <div id="page-wrapper">
    	<div class="container-fluid">
     
    <body>
    <h3 style="max-width:800px;">
    Exemple customisé avec vérification avant upload
    </h3>
    <form id = "form_custom_verif" action = "#" method = "post">
     
         <input type="file" multiple="multiple" name="upload">
         <input type="text" name="UpAbci_uniqidForm" value="">
         <input type="text" name="UpAbci_fragmentSize" value="">
     
    	<p class="bouton_custom_file">Cliquez ou déposez vos fichiers ici</p>
     
     
        <div class="content">
            <p class="replace">
     
            <label style="cursor:pointer"><input type="checkbox" name="replace">&nbsp;Autoriser le remplacement des fichiers existants</label>
            </p>
            <div class="infos_form">                            
                <div class="UpAbci_infosFile">
     
                    <div style="position:relative;padding-bottom:0.35em" data-upabcicss-image-preview="height:70px">
     
     
                        <span style="display:inline-block" class="UpAbci_imgPreview" data-upabcicss-image-preview="width:100px"></span>
     
     
                        <progress class="UpAbci_progressionG" data-upabcicss-in-progress="display:inline" data-upabcicss-result="display:none" data-upabcicss-result-partial="display:inline" data-upabcicss-backup="display:inline"></progress>
     
     
                        <span style="display:none" data-upabcicss-result-partial="display:inline;color:#916C00"> sauvegardé : </span><span class="UpAbci_backup" style="display:none" data-upabcicss-result-partial="display:inline"></span>
     
     
                        <span style="display:none" data-upabcicss-remaining-time-after="display:inline" data-upabcicss-result="display:none"> temps restant : </span><span class="UpAbci_remainingTime" style="display:none" data-upabcicss-remaining-time-after="display:inline" data-upabcicss-result="display:none"> - </span>
     
     
                        <span class="symbol_result" data-upabcicss-result-ok="display:block">&#x2713;</span> 
     
     
                        <span class="symbol_result file_exist" data-upabcicss-result-stop="display:block" data-upabcicss-result-error="display:block" data-upabcicss-result-partial="display:none">x</span>
     
     
                        <span class="symbol_result sauvegarde" data-upabcicss-result-partial="display:block">&#x2758;&#x2758;</span>     
                    </div>
     
                    <div style="padding-bottom:0.3em;min-height:2.8em">
                        <input type="button" class="UpAbci_stop arret" style="width:4em;" data-upabcicss-result="cursor:default;opacity:0.4" value="arrêt">
     
     
                        <span class="UpAbci_name"></span>
     
     
                        <span class="UpAbci_size">0Mo</span>
     
     
     
                        <p class="UpAbci_status" style="display:none" data-upabcicss-in-progress="display:inline-block" data-upabcicss-result-stop="color:red;display:inline-block" data-upabcicss-result-error="color:red;display:inline-block" data-upabcicss-result-ok="color:#916C00;display:block;font-size:0.9em"></p>     
                    </div>
                  </div>
                  <div style="margin-top:1.5em;min-height:4.7em;">
                      <div>
     
                        <input type="button" value="Arrêter tout" class="UpAbci_stopAll arret" style="float:left;width:75px" data-upabcicss-form-end="cursor:default;opacity:0.4">
     
     
                        <input type="button" value="Fermer" class="fermer_formulaire arret" style="float:right;width:55px" data-upabcicss-submit="cursor:default;opacity:0.4" data-upabcicss-form-end="cursor:pointer;opacity:1">
     
     
                        <input type="submit" class="submit" value="Envoyer" style="width:125px;font-size:1.2em;display:block;margin:auto;" data-upabcicss-form-end="display:none">
     
     
                        <input type="button" class="submit fin_traitement" style="width:125px;font-size:0.9em;display:none;margin:auto" data-upabcicss-form-end="display:block" value = "Traitement terminé">         
                      </div>
     
     
    				  <div class="UpAbci_infosServer" style="display:none;clear:both;font-size:1.3em;margin-top:0.5em;" data-upabcicss-infos-server="display:block"></div>
                </div>
            </div>
     
     
            <div class = "backupend" style="display:none;padding:0.5em;font-size:0.7em;background:#FC0">
            <span style="color:#fff;font-size:13px">&#x2759;&#x2759;&nbsp;&nbsp;</span>Les fichiers partiellement sauvegardés peuvent être complétés pendant 24h.
            </div> 
     
        </div>
     
    </form>    
     
     
     
    			</div>
     
                 </div>
     
     
     
     
       <div class="footer">
     
     
     
     
       </div>                 
     
    </div>
     
    <script src="Javascript/jquery.js"></script>
    <script src="Javascript/UploadAjaxABCI.js"></script>
    <script>        
    "use strict"; // Vous pouvez supprimer cette ligne en cas d'utilisation d'autres scripts javascript qui ne supportent pas ce mode.
     
    $(function(){
     
    // Destination ajax de l'upload
    var destination_ajax_upload = 'Php_Upload/UploadAjaxABCI_Upload_Custom_VerifFileExist.php';
     
    // Destination ajax de la vérification des fichiers existants
    var destination_ajax_verif_file = 'Php_Upload/UploadAjaxABCI_VerifFileExist.php';
     
    var form = $("#form_custom_verif");
    var infos_form = form.find(".infos_form");
     
    var Up = new UploadAjaxABCI(destination_ajax_upload, form, infos_form);
     
    // Si vous faites un contrôle des extensions (recommandé), vous devez refaire ce même contrôle côté serveur par sécurité.
    //Up.config.filesExtensions = ['jpg','jpeg','png','gif','mp4','avi','mpg','m2ts','mkv','flv','mp3'];
     
    // Il conviendrait peut-être de baisser (ou mettre à zéro) la valeur ci-dessous pour les smartphones.
    Up.config.imgPreviewMaxSizeTotal = 500; // en Mo poids total maximum de toutes les photos. Au delà les vignettes ne seront pas affichées.
     
    /* (Les valeurs par défaut sont 90 et 60)
    En pixels, hauteur maximale de l'aperçu. Si vous modifier cette valeur faites de même dans le html pour le data-upabcicss-image-preview="height:70px".
    */
    Up.config.imgPreviewMaxHeight = 70;
     
    // En pixels, largeur maximale de l'aperçu. Si vous modifier cette valeur faites de même dans le html pour le data-upabcicss-image-preview="width:100px".
    Up.config.imgPreviewMaxWidth = 100; 
     
    // Option pour indiquer un élément html en remplacement du bouton de sélection des fichiers par défaut du navigateur.
    Up.config.customFileSelect = ".bouton_custom_file";
     
    // Durant le téléchargement des fichiers, applique ces effets sur le bouton d'envoi du formulaire.
    Up.config.cssSubmitOn = "cursor:wait;opacity:0.4";
     
    // Durant le téléchargement des fichiers, applique ces effets le bouton de sélection des fichiers.
    Up.config.cssFileSelectOn = "cursor:wait;opacity:0.7;color:#222";
     
    /* Il s'agit d'une boite spécifiquement dédiée à l'upload, j'interdis donc la soumission du formulaire si aucun fichier n'est soumis. 
    Economise une requête inutile si tous les fichiers sélectionnés ont été arrêtés avant l'envoi et que le formulaire est néanmoins soumis. 
    Voir "config.submitWithoutFileFuncFormEnd" à la ligne suivante qui indispensable dans cet exemple.
    */
    Up.config.submitWithoutFile = false;
     
    /* Si Upload.config.submitWithoutFile = false, l'option ci-dessous (cf mode d'emploi) permet néanmoins le déclenchement de la méthode 
    événementielle "config.func_FormEnd" dont j'ai besoin pour afficher le récapitulatif en fin de traitement du formulaire.
    */
    Up.config.submitWithoutFileFuncFormEnd = true;
     
     
    // Modification des messages par défaut de la classe javascript
    Up.info.status.inProgress = '<span style="color:green;font-style:italic">&nbsp;en cours...</span>';
    Up.info.status.stop = 'arrêt';
    /* Modification de la réponse textuelle du status si téléchargement ok. En mettant vide seules les informations envoyées par php en retour de requête ajax seront affichées. 
    C'est le rond vert défini avec la classe "symbol_result" qui témoignera du status ok.
    */
    Up.info.status.ok = ""; 
     
     
     
    // Définitions de variables nécessaires au script. 
    var content = form.find(".content")
    // Bouton case à cocher
    ,replacef = content.find("input[name=replace]")
    ,custom_select = form.find(Up.config.customFileSelect)
    ,custom_select_texte = custom_select.text()
    ,custom_select_remplacement = "Traitement en cours..."
    ,fermer_formulaire = $()
    ,info_server = $()
    ,verif_deferred = false
    ,slideUp = function(){content.slideUp(400)};
     
     
     
    // Définition d'une méthode javascript événementielle "config.func_FileSelectAll" qui sera exécutée à la sélection des fichiers.
    Up.config.func_FileSelectAll = function(event,tableau)
    {
            /* Par sécurité je décoche l'autorisation de remplacement pour chaque nouvelle sélection de fichiers (ligne à supprimer si l'on veut conserver l'état 
            du checkbox pour différentes sélections de fichier successives, ou si l'on veut indiquer l'attribut checked par défaut dans le html).
            */
            replacef.prop('checked',false);
            
            /* Je réactive le checkbox car je le désactive durant l'envoi des fichiers. Cette ligne peut être conservée dans tous les cas de figure et DOIT être conservée 
            à moins de modifier également les méthodes func_FormSubmit et func_FormEnd).
            */
            replacef.prop('disabled',false);
     
            // J'enregistre le block d'information serveur qui servira plus loin et dans les méthodes suivantes
            info_server = form.find(".UpAbci_infosServer");
     
            // Le bouton de fermeture servira également plus loin et dans les méthodes suivantes
            fermer_formulaire = form.find(".fermer_formulaire");
            
            // L'input(s) de type file sera désactivé durant la requête de vérification des fichiers déjà existants
            var input_file = form.find('input[type="file"]');
     
     
            // Fontion pour définir les propriétés des fichiers et le formatage si l'on autorise le remplacement des fichiers existants
            function remplace(f)
            {
                    // Si le visiteur n'a pas choisi d'arrêter son fichier (f.stop = 0)
                    if(f.stop === 0)
                    {
                            // Affecte la valeur 0 à la propriété interne d'erreur du fichier pour permettre son transfert.
                            f.fichier.upabciErrorUser = 0;
                            
                            // J'envoie un message dans le bloc du status d'information
                            f.upAbci.status.html('<span style="color:red">Le fichier existant sera remplacé</span>').css('display','inline-block');
                            
                            // Je cache le rond rouge
                            f.infosFile.find(".file_exist").css('display','none');
                    }
            }
            
            
            // Fontion pour définir les propriétés des fichiers et le formatage si l'on autorise PAS le remplacement des fichiers existants
            function noremplace(f)
            {
                    // Si le visiteur n'a pas choisi d'arrêter son fichier (f.stop = 0)
                    if(f.stop === 0)
                    {
                            // Affecte la valeur 1 à la propriété interne d'erreur du fichier pour interdire son transfert.
                            f.fichier.upabciErrorUser = 1;
                            
                            // J'envoie un message dans le bloc du status d'information
                            f.upAbci.status.html('<span style="color:red">Ce fichier existe déjà</span>').css('display','inline-block');
            
                            // Je fais afficher le rond rouge
                            f.infosFile.find(".file_exist").css('display','block');
                    }
            }
     
     
            // Initialise le tableau des fichiers sélectionnés qui sera passé côté serveur pour vérification des fichiers déjà existants.
            var controle_files = {};
            
            /* Il y a un tableau d'objets par fichier
            Cf mode d'emploi section "Options de la classe Javascript", paragraphe "Contenu des objets spécifiques à chaque fichier", et faire console.log(tableau) 
            pour comprendre l'exploitation des propriétés des objets.
            //console.log(tableau);
            */
            $.each(tableau, function(i,f)
            {
                    /* Je contruis un objet (controle_files) qui sera envoyé vers le serveur pour contrôler l'existence des fichiers avant la soumission du formulaire.  
                    
                    La propriété "fichier.upabciErrorUser" comptabilise les erreurs utilisateur d'extension et/ou de taille de fichier si on a utilisé les options de 
                    configuration "config.filesExtensions" et/ou "config.fileSizeMax". Si la valeur de "fichier.upabciErrorUser" est supérieure à zéro le fichier 
                    ne sera pas soumis au serveur par la classe javascript.
                    
                    J'exclus  donc ces fichiers ayant une erreur utilisateur (extension ou taille) pour ne contrôler en php que les fichiers qui seront réellement soumis 
                    par la classe javascript. Cette exclusion est indispensable pour interdire côté client le chargement de ces fichiers non valides, 
                    car "upabciErrorUser" sera possiblement modifié et remis à 0 dans la fonction "remplace" définie plus bas si l'on autorise le remplacement des fichiers déjà existants.
                    
                    J'utilise le nom de l'input de type file pour créer l'objet. Permet d'avoir un code générique qui fonctionnerait également avec plusieurs champs de type file 
                    dans un même formulaire.
                    */
                    controle_files[f.fichier.upabciInputName] = Array.isArray(controle_files[f.fichier.upabciInputName]) ? controle_files[f.fichier.upabciInputName] : [];
                    
                    if(f.fichier.upabciErrorUser == 0)
                    {
                            controle_files[f.fichier.upabciInputName].push(f.fichier.name);
                    }
            })
     
            
            // Je sérialise le tableau de fichiers pour le passer en paramètre à la requête ajax de vérification des fichiers déjà existants
            var query_fichiers = $.param(controle_files);
            
            /* Je récupère le token du formulaire pour le passer en paramètre à la requête ajax de vérification des fichiers déjà existants. Il est disponible 
            dans config.uniqidForm (cf. mode d'emploi section "Options de la classe Javascript", paragraphe "Liste des paramètres configurables"), cela m'évite 
            de le rechercher dans le formulaire.
            */
            var UpAbci_uniqidForm = Up.config.uniqidForm;
            
                            
            // Requête de vérification des fichiers déjà existants sur le serveur
            $.ajax({
                    type: 'POST',
                    url: destination_ajax_verif_file,
                    data: {"UpAbci_uniqidForm":UpAbci_uniqidForm,"fichiers":query_fichiers},
                    dataType: "json",
                    beforeSend: function (xhr) 
                    {
                            /* Déclare la variable "verif_deferred" en attente de résolution pour bloquer la soumission des fichiers par l'intermédiaire de la méthode 
                            "Up.config.func_onFormSubmit()" utilisée par la suite.
                            */
                            verif_deferred = $.Deferred();
                            
                            // Annule la possibilité de sélectionner des fichiers
                            input_file.prop('disabled',true);
                    }
            })
            .done(function(reponse) 
            {
                    // "reponse" renvoie soit un tableau de fichiers sous forme d'objet soit une chaine de caractères correspondant au message d'erreur.
                    if(typeof reponse != 'object')
                    {
                            info_server.html('<span style="color:red">'+reponse+'</span>').css('display','block');
                    }
                    else
                    {
                            var files_exist = [];
                            
                            // On re liste le tableau javascript pour avoir une référence aux fichiers
                            $.each(tableau, function(i,f)
                            {
                                    // Les fichiers testés déjà existants ont la valeur = 1, non existants = 0.
                                    if(reponse[f.fichier.upabciInputName] && reponse[f.fichier.upabciInputName][f.fichier.name] == 1)
                                    {
                                            // On enregistre les fichiers déjà existants dans le tableau "files_exist" qui sera utilisé pour définir le comportement on click du checkbox
                                            files_exist.push(f);
                                            
                                            /* On redéfini le formatage et la propriété upabciErrorUser suivant la valeur initiale du chekbox qui autorise ou non le remplacement des fichiers, 
                                            avec les fonction précédemment définies "remplace" et "noremplace"
                                            */
                                            if(replacef.prop("checked"))
                                            {
                                                    remplace(f);    
                                            }
                                            else
                                            {
                                                    noremplace(f);  
                                            }
                                    }
                            })
                            
                            
                            // Permet d'inverser l'autorisation de remplacer ou non les fichiers, onclick sur le chekbox
                            replacef.on("click",function()
                            {
                                    if($(this).prop("checked"))
                                    {
                                            $.each(files_exist, function(i,f)
                                            {
                                                    remplace(f);
                                            })
                                    }
                                    else 
                                    {
                                            $.each(files_exist, function(i,f)
                                            {
                                                    noremplace(f);                                          
                                            })                                              
                                    }
                            })
                            
                            
                            /* 
                            Ne pas inverser l'ordre des lignes ci-dessous car la soumission du formulaire désactive automatiquement la possibilité de sélection des fichiers.
                            Ce fonctionnement automatique pourrait être corrompu si on inversait les deux lignes ci-dessous et si on cliquait sur le bouton de soumission du formulaire 
                            avant la fin de la requête de fichiers déjà existants (même si, pratiquement, c'est difficile à faire).
                            */                      
                            
                            // Retabli la possibilité de sélectionner des fichiers
                            input_file.prop('disabled',false);
                            
                            // Résolution de verif_deferred => témoin de fin de la requête de vérification des fichiers existants. 
                            verif_deferred.resolve();                       
                    }               
            })
            .fail(function() 
            {
                    // Si la requête échoue j'affiche un message dans le bloc ayant la classe ".UpAbci_infosServer"
                    info_server.html('<span style="color:red">Erreur dans la requête de vérification des fichiers existants.</span>').css('display','block');
            })
     
     
            /* 
            Programmation de la boite javascript
            */
            // Je ferme l'éventuel message sur la sauvegarde (si soumission multiples)
            content.find(".backupend").css('display','none');
     
            // slide de fermeture (slideUp) onclick sur le bouton de fermeture
            fermer_formulaire.one("click", slideUp);
                    
            // Je ferme la boite au cas où elle serait ouverte (si soumission multiples) puis je l'ouvre
            content.css('display','none').slideDown();
    }
     
     
    /* Définition d'une méthode javascript événementielle avec ".config.func_onFormSubmit" qui stoppe la soumission du formulaire. On déclenche son envoi avec 
    la méthode "func_SubmitForm()" si la requête de vérification des fichiers existants est terminée.
    */
    Up.config.func_onFormSubmit = function()
    {
            if(verif_deferred)
            {
                    $.when(verif_deferred).done(function()
                    {
                            Up.func_SubmitForm();
                    });
            }
    }
     
     
    // Définition d'une méthode javascript événementielle avec ".config.func_FormSubmit" qui sera exécutée à la soumission du formulaire.
    Up.config.func_FormSubmit = function()
    {
            /* Je désactive le checkbox d'autorisation de remplacement des fichier dès la soumission du formulaire. En effet les valeur des champs du formulaire sont enregistrées 
            dès la soumission du formulaire (voir le fichier UploadAjaxABCI_Champs_Sup_Notation.php pour plus d'explications). Si le visiteur peut changer les valeurs durant 
            le transfert des fichiers, il pourrait croire que son changement sera pris en compte alors que ce ne sera pas le cas. Je la réactiverai uniquement lors d'une prochaine 
            sélection de fichiers dans func_FileSelectAll()
            */
            replacef.prop('disabled',true);
            
            // Durant l'upload je supprime la possibilité de fermeture pour que le visiteur puisse toujours voir les informations
            fermer_formulaire.off("click");
            
            // Je change le contenu de l'entête (.bouton_custom_file) en mettant "Traitement en cours..."
            custom_select.text(custom_select_remplacement);
    }
     
     
    // Définition d'une méthode javascript événementielle qui sera exécutée à la fin du traitement du formulaire (option ".config.func_FormEnd")
    Up.config.func_FormEnd = function(tableau)
    {
            /* Je désactive le checkbox d'autorisation de remplacement des fichier au cas où aucun fichier n'est soumis car dans ce cas on entre pas dans la 
            méthode "func_FormSubmit". C'est juste pour avoir une apparence et des fonctionnalités (désactivées) cohérentes dans ce cas de figure.
            */
            replacef.prop('disabled',true);
                    
            /* L'upload terminé je remet le comportement de fermeture sur le bouton de fermeture et sur le bouton d'information "Traitement terminé" défini dans le html 
            avec ".fin_traitement"
            */
            $.each([form.find(".fin_traitement"), fermer_formulaire], function()
            {
                    $(this).one("click", slideUp)
            }) 
            
            // Je remet le texte initial 
            custom_select.text(custom_select_texte);
            
            /* Je compte le nombre de fichiers entièrement téléchargés ainsi que les fichiers traités et l'existence d'une sauvegarde, en utilisant des propriétés des objets 
            (cf doc : "Options de la classe Javascript -> Contenu des objets spécifiques à chaque fichier"). Décommenter console.log(tableau) pour voir le contenu des tableaux 
            dans la console du navigateur.
            */      
            //console.log(tableau);
            
            var ok = 0;
            var traite = 0;
            var sav = 0;
     
            $.each(tableau, function(i,v)
            {
                    if(v.result == 'ok_done'){
                            ok++;
                    }
                    else if(v.result != '0_0'){
                            traite++;
                    }
                    
                    /* Le préfixe "backup" indique l'existence d'une sauvegarde et le suffixe "done" ou "fail" indique l'état de la requête. Pour un gros fichier qui nécessite 
                    plusieurs requêtes, une requête pourrait être défectueuse mais le fichier pourrait néanmoins avoir une sauvegarde réalisée lors des précédentes requêtes. 
                    Il faut donc tester ces deux résultats pour vérifier la présence d'une sauvegarde créée par le serveur.
                    */
                    if(v.result == 'backup_done' || v.result == 'backup_fail'){
                            sav++
                    }
                    
                    /*
                    Notez que la propriété "result" n'est renseigné qu'au retour de la requête serveur sinon sa valeur est '0_0'. Si je voulais tester l'existence d'une sauvegarde 
                    même si le fichier n'a pas été transmis au serveur, je pourrais tester la propriété "qte_save" qui est renseignée en continu, y compris dès la sélection du fichier 
                    si celui-ci dispose d'une sauvegarde précédente. Je pourrais donc faire :
                    
                    if(v.qte_save > 0){
                            sav++
                    }
                    
                    Mais dans cet exemple c'est redondant. D'une part parceque s'il on arrête le fichier avant l'envoi c'est que l'on ne veut pas le télécharger, et d'autre part ce 
                    message a déjà été affiché précédemment lors de la création de la sauvegarde.   
                    */
            })
            
            /*
            Pour avoir le nombre de fichiers sélectionnés qui n'ont pas été téléchargés avec succès on pourrait faire:
            var fichiers_en_erreur_ou_non_soumis = tableau.length - ok;
            */
     
            switch(ok)
            {
                    /* Aucun fichier sélectionné n'a été soumis car erreur d'extension ou de taille (si vous avez configuré ces options), ou encore les fichiers ont été arrêtés 
                    avant l'envoi du formulaire.
                    */
                    case 0 : if(traite == 0) {info_server.html('Aucun fichier traité')};break;
                    case 1 : info_server.html(ok+' '+'fichier téléchargé');break;
                    // test sur ok > 1 dans la case "default" car un fichier peut être en erreur côté serveur et dans ce cas il n'est pas téléchargé avec succès.
                    default : if(ok > 1) {info_server.html(ok+' '+'fichiers téléchargés')};
            }
            
            info_server.css('display','block');// Je fais afficher le bloc
            
            if(sav > 0)
            {
                    // Slide sur l'information de sauvegarde
                    content.find(".backupend").slideDown(300);
            }
    }
     
    // Démarrage de la fonction d'upload
    Up.Start()});
    </script>
    	</body>
    </html>

    merci pour tes conseils.

  13. #253
    Expert éminent sénior

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

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    j'ai enlevé la session start dans header car il y est déjà dans le fichier config voici le message d'erreur
    Ok cela te fais une erreur en moins, laisses comme ça.

    Warning: Cannot modify header information - headers already sent by (output started at /homepages/4/d602692378/htdocs/sitehtml2020/HTML/backend/test.php:18) in /homepages/4/d602692378/htdocs/sitehtml2020/HTML/backend/backups/header.inc.php on line 9
    C'est quoi cette ligne 9 ?

    Ensuite pour débuguer les variables $UpAbci_uniqidForm et $UpAbci_fragmentSize qui sont vides je t'ai déjà dit de faire un var_dump sur tes variables, suivi d'un exit pour sortir du script. Donc fais-le, juste après la définition de ces variables, et ensuite si ça fonctionne descend dans ton code pour le faire afficher plus loin jusqu'à ce que tu constates que c'est vide, comme ça tu verras mieux l'origine du problème. Donc en premier lieu :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ...
    $UpAbci_uniqidForm = $up->getUniqid();
    var_dump($UpAbci_uniqidForm);exit;
    ...
    et ensuite déplaces le var_dump($UpAbci_uniqidForm);exit; plus bas dans ton code.
    Je ne peux pas le faire à ta place.

    Notes aussi que tu as deux balises d'ouverture <body> dans ton code html généré, il ne devrait y en avoir qu'une, la première.

  14. #254
    Membre habitué
    Inscrit en
    Janvier 2008
    Messages
    1 159
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 1 159
    Points : 149
    Points
    149
    Par défaut
    merci j'ai réussi j'ai repris tous à zero et compris qu'il fallait mettre ton code plus haut qui était en bas.

    Cela marche par contre dans ton ancienne version je récupère le post pour le mettre dans ma base comme ceci :
    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
    if($transfert)
    		{
    			//Si l'on doit indiquer les droits d'accès du fichier, par exemple 604, on pourrait faire
    			/*
    			if(!@chmod($destination_fichier,0604))
    			{
    				$up->exitErreurFichier("Echec de la configuration des droits d'accès du fichier");
    			}
    			*/
     
    			// On souhaite afficher un message textuel si le fichier a été renommé
    			$nom_final = pathinfo($destination_fichier, PATHINFO_FILENAME);
    			$extension_fichier = pathinfo($destination_fichier, PATHINFO_EXTENSION);
    			$nom_final = trim($extension_fichier) != '' ? $nom_final.'.'.$extension_fichier : $nom_final;
     
    			if ($nom_fichier_originel != $nom_final)
    			{
    				$up->addStatusOkAjax("renommé ".$nom_final);
    			}
     
    			if($up->getFichierOk())
    			{
    			$nom_fichier_original_1 =  filter_input(INPUT_POST, 'UpAbci_fichier_nom'); 
    			$nom_fichier_original = rawurldecode($nom_fichier_original_1);
    				try
    				{
    					$bdd = new PDO('mysql:host=******bdd.mysql.db;dbname=*****', ******', '******');
    				}
    				catch(Exception $e)
    				{
    					die('Erreur : '.$e->getMessage());
    				}
     
     
     
    				$bdd->exec('INSERT INTO contenu_page_videos(nom_videos,lien_videos)VALUES(\''.$nom_fichier_original.'\', \''.$nom_fichier_original.'\')');
     
     
     
    				$bdd_ok = true;
    				if ($bdd_ok == true) {
     
    					// Utilisez la fonction "addStatusOkAjax($value)" si vous souhaitez envoyer des messages qui seront concaténés au statut ".info.status.ok" (de la classe javascript) qui renseigne le bloc html ayant la classe "UpAbci_status" dans la ligne d'information du fichier. Par exemple :
    					$up->addStatusOkAjax(", enregistrement en bdd ok.");
    					// affichera "Téléchargement ok, enregistrement en bdd ok." (si vous n'avez pas modifié la valeur de info.status.ok)
    				}
    				/*}*/
    				// Dans le cas du formulaire n°5 le message javascript "info.status.ok" a été configuré vide. On souhaite uniquement afficher un message textuel si le fichier a été renommé
    				if (isset($destination_fichier,$nom_input,$nom_fichier_originel) && $nom_input == 'upload5')
    				{
    					// On ne doit pas utiliser la variable "$nom_fichier_nettoye" précédemment définie car le nom du fichier peut être modifié en cas de doublon sur le serveur puisque j'utilise $up->RenommeDoublon() plus haut. 
     
    					$nom_final = pathinfo($destination_fichier, PATHINFO_FILENAME);
    					$extension_fichier = pathinfo($destination_fichier, PATHINFO_EXTENSION);
    					$nom_final = trim($extension_fichier) != '' ? $nom_final.'.'.$extension_fichier : $nom_final;
     
    					if ($nom_fichier_originel != $nom_final)
    					{
    						$up->addStatusOkAjax("renommé ".$nom_final);
    					}
    				}
    			}
    			/**vide le cache**/
    			clearstatcache();
     
    		}
    comment l'adapter au fichier UploadAjaxABCI_Upload_Infos_Exif.php ?

    Car beaucoup de chose on changé j'ai regardé ton fichier inscription mais ce n'est pas du tout pareil.

    MERCI

  15. #255
    Expert éminent sénior

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

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Citation Envoyé par kate59 Voir le message
    merci j'ai réussi j'ai repris tous à zero et compris qu'il fallait mettre ton code plus haut qui était en bas.
    ...
    dans l'ancienne version je récupère le post pour le mettre dans ma base comme ceci... comment l'adapter au fichier UploadAjaxABCI_Upload_Infos_Exif.php ? Car beaucoup de chose on changé j'ai regardé ton fichier inscription mais ce n'est pas du tout pareil.

    MERCI
    Bon on avance puisque l'upload fonctionne maintenant.

    Pour ta dernière question, tu parles du fichier "UploadAjaxABCI_Upload_Infos_Exif.php" mais dans ton code plus haut tu parles du formulaire "UploadAjaxABCI_Custom_VerifFileExist.php". Quel formulaire utilises-tu exactement ?

    Et si c'est le formulaire "UploadAjaxABCI_Infos_Exif.php" (qui a comme destination Ajax le fichier "UploadAjaxABCI_Upload_Infos_Exif.php") quel comportement veux-tu qu'il ait ? Parce que par défaut et pour l'exemple on fait afficher les informations exif en retour serveur, veux-tu les conserver ? Normalement ce n'est pas nécessaire puisqu'à cet instant le fichier est déjà téléchargé, ce retour est surtout utilisé pour montrer les possibilités de renvoi d'informations serveur vers le formulaire. Et puis dans ton code je vois des champs de bdd nommés "nom_videos" ce qui ne correspond pas à ce formulaire spécialement conçu pour des photos puisqu'il s'agit de retourner les informations exif de fichiers jpg/jpeg.

    Donc
    1/ quel type de fichiers veux-tu uploader,
    2/ quel formulaire utilises-tu,
    3/ et que veux tu faire côté serveur en plus du téléchargement du fichier.
    Pour cette dernière question, apparemment tu veux enregistrer le nom du fichier en bdd, mais il me manque des précisions concernant l'upload lui-même, tu veux renommer le fichier en cas de doublon sur le serveur ou écraser le fichier existant, ou refuser le téléchargement ?

  16. #256
    Membre habitué
    Inscrit en
    Janvier 2008
    Messages
    1 159
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 1 159
    Points : 149
    Points
    149
    Par défaut
    Bonjour,

    j'utilise UploadAjaxABCI_Upload_Custom.php

    1/ j'upload des videos mp4
    2/UploadAjaxABCI_Upload_Custom.php
    3/ je veux refuser le téléchargement en cas de doublon et proposer d'ecraser la video existante quand meme.
    Et apres upload je veux recuperer le nom du fichier dans une table mysql pour pouvoir l'afficher dans une page php par la suite qui est prete.

    Je t'ai joins le code pdo que j'utilise juste avant.

    merci.

  17. #257
    Expert éminent sénior

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

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Si tu veux pouvoir être averti d'un doublon sur le serveur avant l'upload, il vaut mieux utiliser le formulaire "UploadAjaxABCI_Custom_VerifFileExist.php" puisqu'il est justement prévu pour ça, avec la possibilité d'écraser les fichiers existants en cochant la case à cocher "Autoriser le remplacement des fichiers existants". C'est d'ailleurs ce fichier dont tu parlais plus haut dans un de tes messages. Donc on part sur quel formulaire de base, "UploadAjaxABCI_Custom.php" ou "UploadAjaxABCI_Custom_VerifFileExist.php" ?
    Prends le temps de bien réfléchir (à priori "UploadAjaxABCI_Custom_VerifFileExist.php" serait plus adapté à ce que tu veux faire), ensuite je te donnerai un exemple pour le fichier côté serveur.

  18. #258
    Membre habitué
    Inscrit en
    Janvier 2008
    Messages
    1 159
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 1 159
    Points : 149
    Points
    149
    Par défaut
    tu a raison je partirai sur le UploadAjaxABCI_Custom_VerifFileExist.php
    Peut-tu m'aider pour recuperer le nom apres upload en pdo dans ma table de donnée ?

    merci.

  19. #259
    Expert éminent sénior

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

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Donc le fichier de destination Ajax se nomme "UploadAjaxABCI_Upload_Custom_VerifFileExist.php". Fais ta requête d'insertion bdd dans la condition "if($transfert)", j'ai indiqué l'endroit précis dans les commentaires :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    if($transfert)
             {
    		//Si l'on doit indiquer les droits d'accès du fichier, par exemple 604, on pourrait faire
    		/*
    		if(!@chmod($destination_fichier,0604))
    		{
    			$up->exitStatusErreur("Echec de la configuration des droits d'accès du fichier");
    		}
    		*/
     
    		// On souhaite afficher un message textuel si le nom du fichier a été nettoyé
    		$nom_final = pathinfo($destination_fichier, PATHINFO_FILENAME);
    		$extension_fichier = pathinfo($destination_fichier, PATHINFO_EXTENSION);
    		$nom_final = trim($extension_fichier) != '' ? $nom_final.'.'.$extension_fichier : $nom_final;
     
    		if ($nom_fichier_originel != $nom_final)
    		{
    			$up->addStatusOk(SetMessages::get('UpAbRenomme').$nom_final);
    		}
     
                   // Requête Bdd ci dessous, la valeur à insérer est $nom_final
                   // ...		
    	}
    Si tu as besoin d'indiquer les droits d'accès au fichier, supprimes les commentaires avant et après le chmod.

    Sinon étant donné que tu télécharges des vidéos, il serait bien de définir des fragments de fichiers assez grands dans le fichier de formulaire "UploadAjaxABCI_Custom_VerifFileExist.php" pour limiter le nombre de requêtes Ajax et ainsi accélérer le téléchargement. Par exemple $UpAbci_fragmentSize = $up->returnOctets('32M');. Les deux lignes de code suivantes (dans le fichier) adapteront automatiquement cette valeur si elle surpasse les capacités de ton serveur donc tu peux même mettre 64M voire plus.

    L'avantage de mettre des plus petites valeurs est surtout utile pour les utilisateurs qui ne disposent que d'un accès internet bas débit de mauvaise qualité. Etant donné que le serveur fait une sauvegarde pour chaque fragment de fichier, si tu mets 8M ils auront une sauvegarde tous les 8M et en cas de panne ils pourront récupérer 8 ou 16 ou 24 ou 32Mo etc.. ce qui donne plus de granularité dans les sauvegardes, et protège un peu plus l'utilisateur en cas de panne durant l'upload. Mais ces allers retours serveur, bien que transparents pour l'utilisateur, prennent du temps et avec des fragments de 8M il y aura 8 fois plus de requêtes qu'avec des fragments de 64M, soit par exemple 80 requêtes contre 10 pour télécharger un fichier de 640M.

  20. #260
    Expert éminent sénior

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

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Citation Envoyé par kate59 Voir le message
    tu as raison je partirai sur le UploadAjaxABCI_Custom_VerifFileExist.php
    Pour info et au cas où tu n'aies pas bien lu les commentaires de ce script, ce fichier utilise deux requêtes Ajax distinctes:

    - La première pour la vérification des fichiers AVANT upload, vers le script "Php_Upload/UploadAjaxABCI_VerifFileExist.php".
    - La seconde pour l'upload des fichiers vers le script "Php_Upload/UploadAjaxABCI_Upload_Custom_VerifFileExist.php".

    Les dossiers de destination mentionnés doivent être identiques dans ces deux scripts.

    Par mesure de sécurité, le script d'upload peut fonctionner indépendamment du résultat de la première requête Ajax, cependant si l'adresse du dossier de destination n'est pas identique dans ces deux scripts, vous perdrez à minima le contrôle des fichiers existants AVANT la soumission des fichiers et donc tout l'intérêt du code défini dans les fonctions évènementielles, puisque le message "Ce fichier existe déjà" ne pourra être affiché qu'APRES la soumission des fichiers, ce qui est handicapant côté client pour l'upload des gros fichiers et consomme inutilement des ressources serveur.

    Je suis entrain de finaliser une nouvelle version du module d'upload, cet avertissement figure désormais dans le texte de présentation du fichier et non plus seulement dans les commentaires du code source. Voilà je le précise car comme déjà dit, si tu ne penses pas à indiquer le même dossier de destination dans les deux scripts Php, cela fonctionnera quand même, mais tu perds tout l'intérêt de la première requête Ajax.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

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

Partager

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