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. #281
    Membre à l'essai
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2022
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2022
    Messages : 15
    Points : 18
    Points
    18
    Par défaut
    Salut,

    oui je comprends.

    Quand je clique sur le dossier en gras et souligné, je recharge la page et affiche le résultat.

    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 ($ListCr0 = @scandir("Media/$Dossier", 0)) {
         if ($ListCr0){
            foreach ($ListCr0 as $key0 => $fileDir0){
               if ($fileDir0 !="." && $fileDir0 !=".."){
    		if (is_dir ("Media/".$Dossier."/".$fileDir0)){
    		?>
    		<li style="padding:5px">
    		<a href="DossierAdh.php?NoLicMod=<?php echo $NoLicMod ?>&Dossier=<?php echo $Dossier ?>&SousDos1=<?php echo $fileDir0 ?>&Sup=1"  onClick="return confirm('Voulez vous vraiment Supprimer ce Dossier et tout son contenu !')">
    		<img src='Icones/Sup.png' height='10'  title='Supprimer'/></a>&nbsp;
    							
    		<a href="DossierAdh.php?NoLicMod=<?php echo $NoLicMod ?>&Dossier=<?php echo $Dossier ?>&SousDos1=<?php echo $fileDir0 ?>">
                     <img src='Icones/imag_dossier1.png' align='bottom'/> <font size='3' color='#000'><b><?php echo $fileDir0 ?></b></font></a>&nbsp;
    		<?php
    		$ListCr1 ="";
    		if ($SousDos1 == $fileDir0) {
    								
    		$_SESSION['dir_Media']="Media/$Dossier/$SousDos1";
    								
    		if ($ListCr1 = @scandir("Media/$Dossier/$SousDos1", 0)) {
    		  if ($Dossier =="Photos") {
    		    $Src ="../Upload-Ajax-ABCI/UploadAjaxABCI_Traitements_Images2.php";
    		 }else{
    		    $Src ="../Upload-Ajax-ABCI/UploadAjaxABCI2.php";
    		 }
    		?>
    	        <br><iframe  style="margin:0; padding:0;height:120px; width:100%;" src="<?php echo $Src ?>" align="top" name="EnvTestEssai" id="EnvTestEssai" scrolling="yes" frameborder="0" marginheight="0" marginwidth="0">
    	             </iframe>
    	        <?php 
    	     if ($ListCr1){
    
    	       if(sizeof(scandir("Media/".$Dossier."/".$SousDos1))>2){
    	         echo "<p>-------------------- Contenu t&eacute;l&eacute;charg&eacute; -----------------------------</p>";
    	        }
    	        $j =0;
    	       foreach ($ListCr1 as $key1 => $fileDir1){
    	        if ($fileDir1 !="." && $fileDir1 !=".."){
    	          if (is_file ("Media/".$Dossier."/".$SousDos1."/".$fileDir1)){
    	             $j++;
    	             $typFile = strrchr ( ($fileDir1), "." );
    	             $ImagTyp = str_replace($ArrayExtFich ,$ArrayTypFich ,$typFile);
    										   
    		       if($ImagTyp=="image"){
    		           echo "<a href='Media/$Dossier/$SousDos1/$fileDir1' target='_blank'><img height='80'  src='Media/$Dossier/$SousDos1/$fileDir1'/><font size='3'></a> &nbsp;";
    
    		           if ($j ==8){$j =0; echo "<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ";}
    
    		           }elseif($ImagTyp=="video"){
    		           ?> 
    			      <video height="200" controls preload="auto" style="vertical-align:top"> <source src=<?php echo "Media/$Dossier/$SousDos1/$fileDir1"?> />
    				
    			      </video>
    		          <?php
    		         }
    		       }
    	             }							
    	           }
    	            echo "<p>-------------------------------------------------------------------------------------</p>";
    	          }
    	        }
    	      }
    	    }
            }
          }
       }
     }

  2. #282
    Expert éminent sénior

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

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

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

    Je te montre mon set d'essai qui comprend trois fichiers:
    - Basique_frame.php
    - UploadAjaxABCI_Traitements_Images2.php
    - UploadAjaxABCI_Upload_Traitements_Images2.php

    Pour mes essais, "Basique_frame.php" et "UploadAjaxABCI_Traitements_Images2.php" sont tous les deux placés à la racine du répertoire "Upload-Ajax-ABCI", et "UploadAjaxABCI_Upload_Traitements_Images2.php" dans le dossier "Php_Upload".

    - Basique_frame.php :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    <?php
    session_start();
    $_SESSION['dir_Media'] = '../Destination_Upload1';
    $Src = "UploadAjaxABCI_Traitements_Images2.php";
    ?>
    <!DOCTYPE html>
    <html lang="fr">
    <head>
    <meta charset="UTF-8">
    <meta name=viewport content="width=device-width, initial-scale=1">
    <title>Basique Iframe - Upload Ajax ABCIWEB</title>
    </head>
    <body>
     
    <p>paragraphe 1</p>
    <p style="position:relative;width:auto;margin:0;"><iframe id="iframe_upoad" src="<?=$Src?>" onload="var hf=this.contentWindow.document.body.scrollHeight;this.style.height=hf+'px';this.parentNode.style.height=hf+'px'" style="position:absolute;width:100%;top:0;left:0;border:0"></iframe></p>
    <p>paragraphe 3</p>
     
    </body>
    </html>

    UploadAjaxABCI_Traitements_Images2.php:
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    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
    <?php
    /* 
    Utilise le fichier "Php_Upload/UploadAjaxABCI_Upload_Traitements_Images2.php" comme destination Ajax, 
    et la variable de session $_SESSION['upload_location_href'] pour définir la redirection.
    */
    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 (token);
    $_SESSION['UploadAjaxABCI'][$UpAbci_uniqidForm]['token'] = 1;
     
    // Extensions autorisées. Le script ci-dessous permet de centraliser les extensions autorisées ici pour l'ensemble du processus d'upload, en php et javascript 
    $ext_ok = ['.jpg','.jpeg','.png','.gif'];
     
    //Je crée une chaine de caractères en ajoutant une virgule pour l'attribut "accept" du champ de type file
    $accept = implode(",",$ext_ok);
     
    // je supprime les "." pour un affichage dans la balise "legend" du formulaire
    $tab_legend = $up->cleanTabExtensions($ext_ok);
    // Et je crée une chaine de caractères en rajoutant une virgule et un espace
    $legend = implode(", ",$tab_legend);
    $legend = 'fichiers:&nbsp;'.$legend;
    /* 
    J'enregistre les extensions autorisées dans une variable de session pour les passer au script d'upload et j'utilise
    $_SESSION['UploadAjaxABCI'][$UpAbci_uniqidForm] pour préserver l'espace de nom des variables de session
    */
    $_SESSION['UploadAjaxABCI'][$UpAbci_uniqidForm]['ext_ok']= $ext_ok;
     
    // Optionnel: fonction de nettoyage du dossier temporaire (cf mode d'emploi rubrique "Mise en production, notes" ->Technique d'upload, maintenance).
    NettoyageTemp::interval();
     
    // Si $_SESSION['location_href'] n'est pas définie la redirection se fera vers la page d'index.
    $location_href = isset($_SESSION['upload_location_href'])? $_SESSION['upload_location_href'] : 'https://www.uavh.fr/';
     
    ?>
    <!DOCTYPE html>
    <html lang="fr">
    <head>
    <meta charset="UTF-8" />
    <meta name=viewport content="width=device-width, initial-scale=1">
     
    <title>Traitement d'images - Upload Ajax ABCIWEB</title>
     
    <style>
    body {
    	font-family:Arial, Helvetica, sans-serif; 
    	font-size:0.9em;
    	max-width:700px;
    	line-height:1.8em;
    	margin:0;
    	padding:0;
    	/*marge gauche qui s'affichera par rapport au div conteneur de l'iframe*/
    	margin-left:0em;	
    }
     
    p {
    	padding:0;
    	margin:0;
    }
     
    .UpAbci_infosFile {
    	word-wrap:break-word;	
    }
     
    .UpAbci_infosFile progress {
    	width:100px;
    }
    </style>
    </head>
    <body>
     
    <div id="content_form">
    <form id="form_redim" action="#" method="post">
     <fieldset style="border:3px solid #B9B9B9;border-radius:5px;padding:.8em">
        <legend>Upload <?=$legend?></legend>
         <input type="file" name="upload" multiple="multiple" accept="<?=$accept?>" style="display:none">
         <input type="hidden" name="UpAbci_fragmentSize" value="<?=$UpAbci_fragmentSize?>">
         <input type="hidden" name="UpAbci_uniqidForm" value="<?=$UpAbci_uniqidForm?>">
     
         <p id="select_file" style="font-size:15px;letter-spacing:.08em;padding:1em 0.3em;background:#eee;color:#000;text-align:center;cursor:pointer;border-radius:3px">Sélectionnez ou déposez vos fichiers ici</p>     
     
         <!-- Bloc conteneur du retour d'informations -->
         <div id="reponse_upload">
     
            <!--information du fichier que l'on affiche uniquement si un fichier est sélectionné, pour éviter la barre de progression graphique vide si soumission 
            du formulaire sans fichier-->
             <div class="UpAbci_infosFile" style="display:none;margin-top:1em;clear:both;" data-upabcicss-select-file="display:block;">
            	 <hr>
                 <div>
                     <p class="UpAbci_imgPreview" style="float:right"></p><!-- vignettes si le poids total ne dépasse pas la config javascript définie plus bas à 100Mo  -->
     
                    <p>
                    <span class="UpAbci_stop" style="color:red;cursor:pointer;font-size:0.8em;" data-upabcicss-result="cursor:default;opacity:0.5;color:#666">stop </span>
     
                    <span class="UpAbci_name"></span><!-- nom du fichier -->
     
                    <progress class="UpAbci_progressionG"></progress> <!-- progression graphique -->
                    <!-- status (important sinon pas de retour d'information en cas d'erreur) -->
                    <span class="UpAbci_status" data-upabcicss-result-ok="color:green;font-weight:bold" data-upabcicss-result-error="color:red">en attente</span>
                    </p>
                    <p class="photo_exif"></p>
                </div>
                <!-- S'affichera si une sauvegarde existe en cas d'arrêt ou d'erreur si le fichier a été traité par le serveur -->
                <p style="display:none;" data-upabcicss-result-partial="display:block">- sauvegardé : <span class="UpAbci_backup">0 Mo</span></p>
     
             </div>
        </div>
     
     
         <!-- Bloc conteneur retour d'informations du contrôle javascript. J'utilise les styles événementiels data-upabcicss-select-file et data-upabcicss-submit 
         pour supprimer cet affichage à la sélection des fichiers et à la soumission du formulaire -->
         <p class="erreurs_form" style="display:none;border:2px solid red;border-radius:5px;color:red;padding:0.5em;margin-top:1.5em;clear:both" data-upabcicss-select-file="display:none" data-upabcicss-submit="display:none"></p>
     </fieldset>
     
         <!-- Bloc conteneur retour d'informations générales du serveur. J'utilise le style événementiel "data-upabcicss-select-file" pour le cacher dès la sélection 
         de nouveaux fichiers. Il sera affiché si nécessaire dans la méthode événementielle func_FormEnd  -->
         <div class="UpAbci_infosServer" style="display:none;border:2px solid red;border-radius:5px;padding:0.5em;margin-top:.5em;clear:both" data-upabcicss-submit="display:none" data-upabcicss-select-file="display:none"></div>
     
         <p class="submit_file" style="text-align:center;display:none" data-upabcicss-select-file="display:block" data-upabcicss-form-end="display:none"><input type="submit" style="display:inline-block;font-size:18px;letter-spacing:.08em;width:100%;margin:.5em auto .5em auto;padding:0.3em;background: #093;color:#fff;text-align:center;cursor:pointer;border-radius:3px" value="Charger vos fichiers"></p>
     
    </form>
    <!-- span contenant l'adresse de redirection. Sera récupérée par javascript (c'est plus propre que d'écrire du php dans le code javascript et permettrait également d'externaliser le code javascipt)-->
    <span id="location_href" style="display:none"><?=htmlspecialchars($location_href)?></span>
    </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.
     
    // Initialisation de la classe javascript (destination ajax, identifiant formulaire, identifiant réponse)
    $(function(){
     
    // Destination ajax de l'upload
    var destination_ajax = 'Php_Upload/UploadAjaxABCI_Upload_Traitements_Images2.php';
     
    // Redirection renseignée dans le span ayant l'id "location_relaod"
    var location_href = $('#location_href').text();
     
    // Définition d'un objet jQuery correspondant au formulaire
    var form = $('#form_redim');
     
    // Définition d'un objet jQuery correspondant au conteneur du formulaire
    var content_form = $("#content_form");
     
     
     
    //Initialisation de la classe javascript
    var up = new UploadAjaxABCI(destination_ajax, form, '#reponse_upload');
     
    // Extensions autorisées, récupère le contenu de l'attribut accept du champ de type file et construit un tableau
    var file_form = form.find('input[type=file]');
    up.config.filesExtensions = file_form.attr('accept') != undefined ? file_form.attr('accept').split(',') : [];;
     
    // S'affichera si le redimensionnement et l'upload sont ok.
    up.info.status.ok = "OK";
     
    // Message d'erreur si problème serveur. Sera complété par le message renvoyé par le serveur pour plus de précision.
    up.info.status.errorServer = "Echec du traitement. ";
     
    up.config.imgPreviewMaxWidth = 100; // en pixels, largeur maximale de l'aperçu
    up.config.imgPreviewMaxHeight = 100;// en pixels, hauteur maximale de l'aperçu
     
    // Bouton de sélection personnalisé
    up.config.customFileSelect = '#select_file';
     
    // Etant donné que le formulaire n'evoie que des fichiers, on interdit sa soumission si aucun fichier n'est sélectionné
    up.config.submitWithoutFile = false;
     
    // Durant la soumission du formulaire on formate le bloc "Charger les fichiers" avec une faible opacité
    up.config.cssSubmitOn = "opacity:.5";
     
     
    // Création d'une fonction pour définir la hauteur de l'iframe et de son conteneur
    function setDimIframe () {
    	// Cible l'iframe et son conteneur
    	var iframe = $(window.parent.document.getElementById("iframe_upoad"));
    	var div_content = iframe.parent();
     
    	if (iframe.length && div_content.length && content_form.length){
    		var fh = content_form.height();
    		div_content.css("height",fh);
    		iframe.css("height",fh);
    	}
    }
     
     
    // Création d'une fonction pour créer la redirection de la fenêtre parente (si pas de parent iframe on fait la redirection dans la même page).
    function redirection(){
    	window.parent.document.location.href = location_href;
    }
     
     
    /* 
    Cette fonction (qui est déclenchée onchange sur le sélecteur de fichiers) permet de redimensionner l'iframe si le visiteur a précédemment fait une sélection
    de fichiers puis en refait une seconde et qu'il annule sa sélection depuis la boite de sélection des fichiers proposée par le système d'exploitation.
    Dans ce cas, Chrome et Edge suppriment le contenu de la sélection précédente, il faut donc redimensionner de contenu de l'iframe, 
    sinon cela ferait un trou par rapport au bloc html suivant le formulaire d'upload. 
    */
    up.config.func_FileSelectAllBefore = function(event,tableau)
    {
            setTimeout(setDimIframe,200);
    }
     
    // On redimensionne l'iframe pour chaque image de prévisualisation chargée
    up.config.func_ImgPreviewLoadEach = function(image, obj)
    {
    	setDimIframe();
    }
     
    /* Définition d'une méthode javascript événementielle "config.func_FileSelectAll" qui sera exécutée à la sélection des fichiers.
    On redimensionne l'iframe au cas où certaines images seraient corrompues, ou que l'on charge des fichiers qui ne sont pas des images. 
    */
    up.config.func_FileSelectAll = function(event,tableau)
    {
    	setDimIframe();
    }
     
    /* Définition d'une méthode javascript événementielle "config.func_FileEndEach" qui sera exécutée à la fin du traitement de chaque fichier.
    Au cas où la réponse du serveur renvoie du texte qui modifierait la hauteur du formulaire, on redimensionne l'iframe
    */
    up.config.func_FileEndEach = function(tableau, info_server)
    {
    	setDimIframe();
    }
     
    // 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, info_server)
    {
    	/* Si info_server est renseigné dans la fonction de callback "config.func_FormEnd", c'est qu'un message est retourné depuis le serveur, voir "addInfosServer" côté serveur suite
    	au contrôle des dossiers et du tableau des extensions autorisées. "info_server" peut aussi être renseeignée en interne par la classe d'upload en cas de dysfonctionnement. 
    	Cette information est retournée automatiquement dans le bloc html ayant la classe "UpAbci_infosServer". 
    	Mais dans le html ce bloc est caché par défaut, je devrai donc le faire afficher en cas de besoin. 
    	*/
     
    	/* J'afficherai également un message dans ce bloc si il y a eu un problème serveur ou lors des redimensionnemnts pour que le visiteur
    	ait le temps de voir les messages dans les informations spécifiques aux fichiers avant la redirection, tout en proposant un lien pour voir les fichiers traités.
    	*/
     
    	/*
    	Les fichiers ayant une propriété "result" DIFFERENTE de '0_0' on tous été traités par le serveur quelque soit le résultat final. Pour trouver le nombre de fichiers 
    	en echec côté serveur on pourra donc faire : traités - ok. Cela permet d'exclure les fichiers arrêtés volontairemeent par l'utilisateur ou non soumis par
    	javascript pour erreur d'extension ou dépassement de taille autorisée (si l'on a configuré ces options) et dont l'information a déjà été affichée dans 
    	le retour d'information spécifique aux fichiers avant la soumission du formulaire.
            Voir le mode d'emploi "Configuration serveur ->Récupération des paramètres prédéfinis de la requête Ajax" pour comprendre le contenu des tableaux.
    	*/
    	var ok = 0, traite = 0;
     
    	$.each(tableau, function(i,v)
    	{
    		if(v.result == 'ok_done'){
    			ok++;
    		}
    		if(v.result != '0_0'){
    			traite++;
    		}
    	})
     
     
    	var bloc_info_server = form.find(".UpAbci_infosServer");
    	/* Si des fichiers on été en erreur lors de leur traitement côté serveur, on informe le visiteur pour qu'il consulte le résultat et l'on ajoute un lien pour
    	observer le résultat des fichiers ok. Sinon on renvoie directement vers les fichiers ok.
    	*/
    	if (traite > ok)
    	{
    		// Message d'information
    		var message = '<p>Certains fichiers n\'ont pas été traités. Voir les informations dans la liste des fichiers.</p>';
     
    		/* Si info_server est renseigné j'utilise la méthode append pour ne pas l'effacer et afficher "message" à la suite,
    		sinon la méthode html pour effacer les erreurs des éventuels upload précédents. */
    		info_server ? bloc_info_server.append(message) : bloc_info_server.html(message);
     
    		// Si certains sont ok on ajoute un lien
    		if (ok > 0) {
    			bloc_info_server.append('<p class="redirection" style="text-decoration:underline;cursor:pointer">Voir les fichiers traités</p>');
    			bloc_info_server.find(".redirection").on("click",function(){
    				redirection();
    			})
    		}
    	}
     
    	// Si erreur de tous ou certains fichiers ou erreur de dossier côté serveur on affiche le bloc et on redéfini la hauteur de l'iframe
    	if(traite > ok || info_server)	
    	{
    		// Je fais afficher le bloc avec un slide et j'ajuste la hauteur de l'iframe
    		bloc_info_server.slideDown(10, 'linear', function(){
    			setDimIframe();
    		});
    	}	
    	else
    	{
    		// Si pas d'erreur on fait la redirection de la page incluant l'iframe.
    		redirection();
     
    		// Si ce n'était pas une redirection il faudrait appliquer setDimIframe() dans cette condition, cf. note ci-dessous.
    	}
     
    	/*A noter que le bloc de chargement des fichiers (submit) s'efface dès la fin du téléchargement (cf. stlyle évènementiel "data-upabcicss-form-end="display:none" 
    	situé dans son html) ce qui modifie donc la hauteur de l'iframe.
    	Dans d'autres contextes il faudrait donc appliquer "setDimIframe()" pour redimensionner l'ifrrame. Mais ici, soit on a un retour serveur qui renvoie des erreurs
    	et setDimIframe() est utilisé dès son affichage, et si pas d'erreur on est directment redirigé avec "redirection()" donc pas la peine de redimensionner l'iframe. 
    	*/
    }
     
    // Démarrage DOM chargé
    up.Start();
    });
    </script>
    </body>
    </html>

    UploadAjaxABCI_Upload_Traitements_Images2.php:
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
     
    <?php
    /*
    Utilise "$_SESSION['dir_Media']" pour définir le répertoire de destination des fichiers
    
    et une variable de session définie dans "UploadAjaxABCI_Traitements_Images2.php" pour définir les extensions autorisées  (afin de centraliser ce paramètre)
    */
    session_start();
     
    $dossier_destination = isset($_SESSION['dir_Media']) ? $_SESSION['dir_Media'] : ''; 
     
    // Au cas où l'on aurait oublié le slash final on le rajoute (on compare $dossier_destination avec sa valeur amputée de l'éventuel slash final supprimé avec rtrim)
    $dossier_destination = $dossier_destination == rtrim($dossier_destination, '/') ? $dossier_destination.'/' : $dossier_destination;
    // Note: si $dossier_destination est initialement vide, il sera donc égale à "/" après le traitement ci-dessus, d'où le contrôle $dossier_destination == '/' plus bas.  
     
    // Charge la classe php d'upload et la classe de redimensionnement avec spl_autoload_register
    spl_autoload_register(function ($class) {require 'Classes/' . $class . '.php';});
     
     
    /* On ne configure pas ici la classe pour contrôler les extensions car le tableau autorisé est dans $_SESSION['UploadAjaxABCI'][$uniqid_form]['ext_ok'].
    On a donc besoin de récupérer $uniqid_form avec la méthode "getParam" de la classe d'upload qui doit donc être auparavant initialisée.
    On contrôlera les extensions un peu plus loin dans le script.
    */ 
    $up = new UploadAjaxABCIServeur();
     
    // Décommenter la ligne ci-dessous en phase de développement pour faire afficher les erreurs php dans le formulaire.
    //$up->setModeDebug ();
     
    // Récupère le token du formulaire
    $uniqid_form = $up->getParam("uniqid_form");
     
    // Vérifie le token de sécurité du formulaire
    if(!(isset($uniqid_form,$_SESSION['UploadAjaxABCI'][$uniqid_form]['token']))) $up->exitStatusErreur(SetMessages::get('UpAbVerifToken')); 
     
    // Récupère le tableau des extensions autorisées
    $ext_ok = isset($_SESSION['UploadAjaxABCI'][$uniqid_form]['ext_ok']) ? $_SESSION['UploadAjaxABCI'][$uniqid_form]['ext_ok'] : [];
     
    // Si $dossier_destination n'existe pas ou n'est pas un répertoire, ou si le tableau d'extensions autorisées est vide, on arrête tout.
    if($dossier_destination == '/' || !is_dir($dossier_destination) || empty($ext_ok))
    {
    	$message = empty($ext_ok) ? 'Tableau des extensions autorisées non valide.' : 'Répertoire de destination des fichiers non valide.';
    	// Commande à javascript de stopper la soumission du formulaire à réception de la requête ajax. Erreurs majeures donc pas la peine de poursuivre pour les fichiers suivants.
    	$up->stopForm();
    	// Envoie un message dans le bloc html ayant la classe "UpAbci_infosServer"
    	$up->addInfosServer ($message);
    	// Et sort du traitement php en envoyant les informations nécessaires vers javascript
    	$up->exitReponseAjax();
    }
     
     
    // Voir le mode d'emploi "Configuration serveur -> Gestion des erreurs fatales du serveur" pour plus d'informations.
    $tab_erreurs = [];
    $tab_erreurs['Allowed memory size'] = [SetMessages::get('UpAbAllowedMemorySize'),true];
    $tab_erreurs['Maximum execution time'] = [SetMessages::get('UpAbMaximumExecutionTime'),true];
    $up->catchErrorServer($tab_erreurs);
     
     
    // S'assure qu'un fichier ou qu'un fragment de fichier est en téléchargement
    if($up->getFragment())
    {
    	// getCleanFileName() retourne le nom du fichier nettoyé
    	$nom_fichier = $up->getCleanFileName();
     
    	// Vérification des extensions autorisées
    	if($up->verifExtensions($nom_fichier,$ext_ok) == false) 
    	{
    		$up->exitStatusErreur(SetMessages::get('UpAbExtensionFichier'));
    	}
     
    	// Upload dans le dossier temporaire
    	$up->Upload();
     
    	/* Retourne l'adresse du fichier temporaire quand il est complet, sinon false. 
    	Noter que le fichier temporaire a été renommé automatiquement en une chaine de caractères aléatoire et qu'il ne possède pas d'extension.
    	*/
    	$fichier_complet = $up->getTempAdressFileComplete();
    	if($fichier_complet != false)
    	{
    		// Extension du ficher
    		$ext = $up->getExtension($nom_fichier);
     
    		// Redimensionnements
    		try
    		{			
    			/*
    			 Dans cet exemple tous les fichiers vont dans le même dossier, c'est le nom du fichier qui change.
    			- Trouve le nom du fichier sans l'extension pour ajouter un suffixe _max, _moyen ou _min.
    			*/
    			$filename = pathinfo($nom_fichier, PATHINFO_FILENAME);
     
    			$nom_fichier_max = $filename.'_max.'.$ext;
    			$nom_fichier_min = $filename.'_min.'.$ext;
     
    			/* 
    			ImgGD requière en premier paramètre, l'adresse du fichier temporaire (lorsqu'il est complet) 
    			et en second paramètre, l'extension du fichier car les fichiers temporaires n'ont pas d'extension.
    			*/
    			$gd = new ImgGD($fichier_complet, $ext);
     
    			$gd->redim(1920, 1920);		
    			$gd->export($dossier_destination.$nom_fichier_max);
     
    			$gd->redim(200, 200);		
    			$gd->export($dossier_destination.$nom_fichier_min);
     
     
    			// IMPORTANT : Quand le traitement sur les images est terminé on supprime les ressources qui prennent beaucoup de place en mémoire
    			$gd->ressDestroy();
     
    			/*
    			Si l'on arrive ici c'est que le traitement des images est ok car les fonctions précédentes renvoient des erreurs dans le catch en cas de problème.
    			On donne le status ok pour le retour ajax et l'on efface le fichier temporaire et le cookie de sauvegarde avec la méthode 
    			"SetTransfertOkDelFileTempCookie()" de la classe d'upload.
    			Plus d'information Cf. mode d'emploi "Configuration serveur" -> "Upload sans Transfert(), fichier temporaire".
    			*/
    			$up->SetTransfertOkDelFileTempCookie();
     
    			// Si besoin on défini les droits d'accès aux fichiers avec la méthode "setChmod" de la classe d'upload
    			$up->setChmod($dossier_destination.$nom_fichier_max, 0604);
    			$up->setChmod($dossier_destination.$nom_fichier_min, 0604);
    		}
    		catch (Exception $e) 
    		{
    			// Efface le cookie de sauvegarde et le fichier temporaire 
    			$up->deleteFileTempCookie();
    			// Sort du script et retourne le message d'erreur de la classe "ImgGD"
    			$up->exitStatusErreur($e->getMessage());
    		}
     
    		// Si l'on arrive ici c'est que tout s'est bien passé, on pourrait donc enregistrer le nom du fichier en bdd
    		// ... enregistrement bdd
    	}
    }
     
    // Voir le fichier "UploadAjaxABCI_Upload.php" pour des possibilités ou informations supplémentaires.
    // Indispensable en fin de script
    $up->exitReponseAjax();
    ?>

    Fais des tests avec ces fichiers positionnés comme indiqué plus haut et sans rien modifier cela devrait fonctionner. Chez moi l'iframe se redimensionne correctement et la redirection fonctionne depuis la page incluant l'iframe (donc ele fonctionnera par rapport à la page de ton script php).

    Tant que la variable de session $_SESSION['upload_location_href'] n'est pas renseignée (et ce n'est pas le cas dans mon exemple), la redirection se fait vers la page d'accueil de ton site si succès total des upload. En cas de succès partiel j'affiche un message et un lien pour la redirection.

    Et maintenant une possible intégration dans ton script.
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    <?php
     if ($ListCr0 = @scandir("Media/$Dossier", 0)) {
         if ($ListCr0){
            foreach ($ListCr0 as $key0 => $fileDir0){
               if ($fileDir0 !="." && $fileDir0 !=".."){
    		if (is_dir ("Media/".$Dossier."/".$fileDir0)){
     
    		 /*Puisque apparemment tu reviens vers cette page après upload, il serait intéressant de définir un id dynamique sur la balise li
            pour que le rechargement de la page se positionne directement à cet endroit.
            La combinaison $Dossier.$fileDir0 semble unique tu pourrais donc t'en servir (je la met en minuscules)
           */		
    		$ancre = strtolower($Dossier.$fileDir0);
    		?>
     
    		<li id="<?=$ancre?>" style="padding:5px">
     
            <!--Ajout d'une balise p pour mieux pouvoir positionner l'iframe par rapport à cette ligne-->
    		<p style="margin:0;padding:0"><a href="DossierAdh.php?NoLicMod=<?php echo $NoLicMod ?>&Dossier=<?php echo $Dossier ?>&SousDos1=<?php echo $fileDir0 ?>&Sup=1"  onClick="return confirm('Voulez vous vraiment Supprimer ce Dossier et tout son contenu !')">
    		<img src='Icones/Sup.png' height='10'  title='Supprimer'/></a>&nbsp;
     
    		<a href="DossierAdh.php?NoLicMod=<?php echo $NoLicMod ?>&Dossier=<?php echo $Dossier ?>&SousDos1=<?php echo $fileDir0 ?>">
                     <img src='Icones/imag_dossier1.png' align='bottom'/> <font size='3' color='#000'><b><?php echo $fileDir0 ?></b></font></a>&nbsp;
            </p>
    		<?php
    		$ListCr1 ="";
    		if ($SousDos1 == $fileDir0) {
     
    		/*
    		Le formulaire d'upload utilise la variable de session "$_SESSION['upload_location_href']" pour définir la redirection suite à l'upload.
    		Il conviendrait donc de la définir ici en rajoutant ."#".$ancre pour faire la redirection directement vers l'élement ayant cet id.
    		*/
    		$redirection = '...';
    		$_SESSION['upload_location_href'] = $redirection."#".$ancre;
     
    		$_SESSION['dir_Media']="Media/$Dossier/$SousDos1";
     
    		if ($ListCr1 = @scandir("Media/$Dossier/$SousDos1", 0)) {
    		  if ($Dossier =="Photos") {
    		    $Src ="../Upload-Ajax-ABCI/UploadAjaxABCI_Traitements_Images2.php";
    		 }else{
    		    $Src ="../Upload-Ajax-ABCI/UploadAjaxABCI2.php";
    		 }
    		?>
            <!-- Ajout de l'iframe dans un paragraphe-->
    		<p style="position:relative;width:auto;margin:0;"><iframe id="iframe_upoad" src="<?=$Src?>" onload="var hf=this.contentWindow.document.body.scrollHeight;this.style.height=hf+'px';this.parentNode.style.height=hf+'px'" style="position:absolute;width:100%;top:0;left:0;border:0"></iframe></p>
    	        <?php 
    	     if ($ListCr1){
     
    	       if(sizeof(scandir("Media/".$Dossier."/".$SousDos1))>2){
    	         echo "<p>-------------------- Contenu t&eacute;l&eacute;charg&eacute; -----------------------------</p>";
    	        }
    	        $j =0;
    	       foreach ($ListCr1 as $key1 => $fileDir1){
    	        if ($fileDir1 !="." && $fileDir1 !=".."){
    	          if (is_file ("Media/".$Dossier."/".$SousDos1."/".$fileDir1)){
    	             $j++;
    	             $typFile = strrchr ( ($fileDir1), "." );
    	             $ImagTyp = str_replace($ArrayExtFich ,$ArrayTypFich ,$typFile);
     
    		       if($ImagTyp=="image"){
    		           echo "<a href='Media/$Dossier/$SousDos1/$fileDir1' target='_blank'><img height='80'  src='Media/$Dossier/$SousDos1/$fileDir1'/><font size='3'></a> &nbsp;";
     
    		           if ($j ==8){$j =0; echo "<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ";}
     
    		           }elseif($ImagTyp=="video"){
    		           ?> 
    			      <video height="200" controls preload="auto" style="vertical-align:top"> <source src=<?php echo "Media/$Dossier/$SousDos1/$fileDir1"?> />
     
    			      </video>
    		          <?php
    		         }
    		       }
    	             }							
    	           }
    	            echo "<p>-------------------------------------------------------------------------------------</p>";
    	          }
    	        }
    	      }
    	    }
            }
          }
       }
     }
     ?>
    J'ai mis des commentaires. Si tu as des problèmes, vérifies l'adresse des dossiers et l'adresse des scripts dans chaque fichier.

    Si tu veux modifier la largeur du formulaire ou sa marge, ne le fais pas dans ton script ci-dessus mais dans "UploadAjaxABCI_Traitements_Images2.php".

    Et enfin donnes-moi des nouvelles quand tu aura terminé les essais, quelque soit le résultat

  3. #283
    Membre à l'essai
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2022
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2022
    Messages : 15
    Points : 18
    Points
    18
    Par défaut
    Ok,

    Merci pour le retour

    Je m'emploie à décortiquer tout cela et je te réponds quand à l'essai.

    @+

  4. #284
    Membre à l'essai
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2022
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2022
    Messages : 15
    Points : 18
    Points
    18
    Par défaut
    Salut,

    J'ai eu une petite frayeur quand j'ai testé la nouvelle config, ma fenêtre s'affichait vide ! Après de longue vérification c'est la variable $_SESSION['dir_Media']="Media/$Dossier/$SousDos1"; qui posait problème.
    Je l'ai supprimé et l'affichage ce fait, mais le formulaire " UploadAjaxABCI_Traitements_Images2.php " reste invisible mais on voit que l'emplacement s'est agrandit quand je clique sur le sous dossier.
    Par contre dans l'appli Dreamweaver cc 2017 avec "UploadAjaxABCI_Traitements_Images2.php", depuis la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    11 spl_autoload_register(function ($class) {require 'Php_Upload/Classes/' . $class . '.php';});
    un defaut est signalé par : syntax error , unexpected identifier (T_STRING)

    Idem à chaque ligne de variable.

    Bonne journée

  5. #285
    Expert éminent sénior

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

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 382
    Points : 10 410
    Points
    10 410
    Par défaut
    Quand tu concatènes des variables avec du texte, il est recommandé d'utiliser des quotes simples et des points, par exemple $_SESSION['dir_Media']='Media/'.$Dossier.'/'.$SousDos1;.

    Tu peux aussi vérifier le contenu des variables avec "var_dump()", par exemple var_dump($_SESSION['dir_Media']);exit;. N'oublies pas le "exit;" en fin de ligne pour sortir du script à cet endroit, sans cela, entre ta boucle et tes redirections il est possible que tu ne vois pas le résultat.

    Je ne sais pas ce que signale Dreamweaver avec unexpected identifier. C'est probablement le chemin 'Php_Upload/Classes/' qui n'est pas le bon. Adaptes ce chemin par rapport au script d'upload php. Fais un : var_dump(is_dir('Php_Upload/Classes/'));exit; pour voir.
    Mets aussi un exit; (pour débugger uniquement) juste après l'insertion de ton iframe pour sortir du script à cet endroit.

    Et sinon, mon set d'essai fonctionnait-il ? Si oui, c'est que tes problèmes proviennent des chemins d'accès, adresses des scripts javascript, adresses des dossiers php...

  6. #286
    Membre à l'essai
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2022
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2022
    Messages : 15
    Points : 18
    Points
    18
    Par défaut
    Salut,

    Après investigation je n'ai pas trouvé de solution.

    Voici la capture d'écran quand je passe part "Basique_frame.php" avec test "var_dump(is_dir('UploadAjaxABCI_Traitements_Images2.php'));exit;"
    Nom : Capture_Basique_frame.php_2022-12-17_101558.jpg
Affichages : 200
Taille : 12,4 Ko



    Avec avec le sous dossier (serveur en local pour afficher l'erreur)
    Nom : CaptureErreurEnLocal_2022-12-17_091618.jpg
Affichages : 197
Taille : 33,4 Ko


    Bon, c'est trop compliqué pour moi, pour le moment je vais continuer à utiliser la 1ere version qui fonctionne bien.

    je pensais à une chose, comme je dispose du nombre d'image à uploader par JS, est-ce qu'on pourrait incrémenter une variable à chaque fois que le téléchargement est OK et quand il y a égalité entre la variable et le nombre d'image, je puisse activer le sous dossier pour afficher le résultat.

    En tous cas merci pour ta patience

    Bonne journée

  7. #287
    Expert éminent sénior

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

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 382
    Points : 10 410
    Points
    10 410
    Par défaut
    Citation Envoyé par marcouni Voir le message
    Salut,

    Après investigation je n'ai pas trouvé de solution.
    Cela ne m'étonnes pas. Je viens de faire un test en recopiant les exemples de code que j'ai postés sur le forum et ça bug de partout. Pourtant ces mêmes codes fonctionnent chez moi.

    J'ai mis un moment à comprendre moi aussi. En fait lors du copier dans le forum il y a des caractères invisibles qui sont insérés la plupart du temps dans les lignes vides, et qui malheureusement sont interprétés par php et le font bugguer. Et comme précisément on ne les voit pas, c'est pas évident à débugguer.

    Le plus simple est que tu cliques sur mon pseudo "ABCIWEB" puis une seconde fois sur "Message privé" qui s'affichera dans la liste. Et donc envoies-moi un message en me laissant ton adresse mail, je t'enverrai en retour un Zip qu'il te suffiras de dézipper pour avoir des fichiers propres.


    Pour le reste, j'ai vu un problème dans ton code pour la définition des variables de session. Comme il s'agit d'une boucle, en fait ces variables sont redéfinies à chaque itération de ta boucle. Il faut donc les définir après condition et en définir des différentes pour chaque condition. Par exemple à la place de
    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
    if ($SousDos1 == $fileDir0) {
    		/*
    		Le formulaire d'upload utilise la variable de session "$_SESSION['upload_location_href']" pour définir la redirection suite à l'upload.
    		Il conviendrait donc de la définir ici en rajoutant ."#".$ancre pour faire la redirection directement vers l'élement ayant cet id.
    		*/
    		$redirection = '...';// Les trois points sont à remplacer par l'adresse de redirection.
    		$_SESSION['upload_location_href'] = $redirection.'#'.$ancre;
     
    		$_SESSION['dir_Media']="Media/$Dossier/$SousDos1";
     
    		if ($ListCr1 = @scandir("Media/$Dossier/$SousDos1", 0)) {
    		  if ($Dossier =="Photos") {
    		    $Src ="../Upload-Ajax-ABCI/UploadAjaxABCI_Traitements_Images2.php";
    		 }else{
    		    $Src ="../Upload-Ajax-ABCI/UploadAjaxABCI2.php";
    		 }
    		?>

    Il faudrait plutôt faire :
    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
    if ($SousDos1 == $fileDir0) {
    		/*
    		Le formulaire d'upload utilise la variable de session "$_SESSION['upload_location_href']" pour définir la redirection suite à l'upload.
    		Il conviendrait donc de la définir ici en rajoutant ."#".$ancre pour faire la redirection directement vers l'élement ayant cet id.
    		*/
    		if ($ListCr1 = @scandir("Media/$Dossier/$SousDos1", 0)) {
    		  if ($Dossier =="Photos") {
    		     $redirection = '...';// Les trois points sont à remplacer par l'adresse de redirection.
    		     $_SESSION['upload_location_href_photo'] = $redirection."#".$ancre;
    		    $_SESSION['dir_Media_photo']="Media/$Dossier/$SousDos1";
    		    $Src ="../Upload-Ajax-ABCI/UploadAjaxABCI_Traitements_Images2.php";
    		 }else{
    		     $redirection = '...';// Les trois points sont à remplacer par l'adresse de redirection.
    		     $_SESSION['upload_location_href_video'] = $redirection."#".$ancre;
    		    $_SESSION['dir_Media_video']="Media/$Dossier/$SousDos1";
    		    $Src ="../Upload-Ajax-ABCI/UploadAjaxABCI2.php";
    		 }
    		?>

    Consultes aussi les fonction que tu utilises sur la doc php. Par exemple "is_dir" teste si la chaine de caractère passée dans cette fonction est un répertoire. Donc normal que is_dir('UploadAjaxABCI_Traitements_Images2.php') retourne false. Par contre var_dump(is_dir('Php_Upload/Classes/')) qui retourne true est bon signe, c'est que le répertoire est accessible avec cette adresse.

    Quant au bug spl_autoload_register comme déjà dit, il provient des caractères invisibles insérés dans les lignes vides précédentes.

    Attention aussi de ne pas laisser les var_dump(...); exit; dans ton code, il faut les supprimer dès que tu as eu le message qui te sert pour le debug.

    je pensais à une chose, comme je dispose du nombre d'image à uploader par JS, est-ce qu'on pourrait incrémenter une variable à chaque fois que le téléchargement est OK et quand il y a égalité entre la variable et le nombre d'image, je puisse activer le sous dossier pour afficher le résultat.
    C'est bien ce que fait le script que je t'ai donné. La variable "$redirection" dans le code ci-dessus doit être égale à l'adresse de ce sous dossier, et si tu ne sais pas définir la variable "$anrre", il te suffiras de faire $_SESSION['upload_location_href_photo'] = "adresse du sous dossier";

    Ah oui encore une fois, copies uniquement le code utile (sans les espaces) et ligne par ligne si tu veux faire des essais avec ces exemples, ou ne copies pas et réécrit à la main pour éviter ces foutus bug liés au forum. J'en parlerai à un administrateur pour voir ce qu'il peut faire, je ne me souviens pas avoir eu ce genre de problème précédemment (d'ailleurs il y a aussi des "*" qui s'insèrent parfois quand l'on colle du texte dans les messages sans que l'on sache pourquoi).

    Bref t'as pas eu de chance, envoies-moi ton mail et ça devrait aller mieux

    Il te suffiras juste d'optimiser la boucle de ton code php pour définir les variables de session, mais bon si tu savais déjà définir ton sous dossier précédemment, c'est la même valeur à attribuer à $_SESSION['upload_location_href_photo'], quant à $_SESSION['dir_Media_photo'] il faut juste se souvenir que c'est l'adresse du répertoire de destination par rapport au script "Php_Upload/UploadAjaxABCI_Upload_Traitements_Images2.php" mais si cette adresse ne correspond pas à un répertoire, le script t'avertira.

  8. #288
    Membre à l'essai
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2022
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2022
    Messages : 15
    Points : 18
    Points
    18
    Par défaut
    Salut,

    Effectivement avec ces nouveaux fichiers Le mode photo avec redirection fonctionne très bien.

    La redirection m'a donné un peu de soucis (partir d'un endroit et se diriger vers un autre). Je commence à comprendre le fonctionnement des sessions.

    Si je peux utiliser ce formulaire pour mes téléchargements de vidéos serait génial sans les re-dimensions GD bien sur.

    Pour le moment ça me crée des erreurs sur l’extension des fichiers.

    Merci encore

  9. #289
    Expert éminent sénior

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

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 382
    Points : 10 410
    Points
    10 410
    Par défaut
    Citation Envoyé par marcouni Voir le message

    Pour le moment ça me crée des erreurs sur l’extension des fichiers.

    Merci encore
    Plus exactement pour le chmod d'après ton email. En fait, il faut tester le retour de la méthode Tranfert() dans le fichier d'upload serveur pour être certain que le fichier complet a été déplacé vers son emplacement définitif avant d'appliquer la méthode setChmod().

    Je viens de t'envoyer un set de fichiers avec en complément, un contrôle (facultatif) de la taille maximale de fichier autorisée pour tes vidéos. C'est effectivement le même principe que pour les photos, mais bien sûr j'ai modifié les extensions autorisées et supprimé la fonction évènementielle config.func_ImgPreviewLoadEach() dans le code javascript du fichier du formulaire puisque cette fonction ne concerne que les les images de prévisualisation des photos. Elle ne gênait pas mais elle était inutile.

    Et côté upload, étant donné que l'on n'utilise pas la méthode export() de la classe ImgGD() pour transférer les fichiers vers leur emplacement définitif, il faut utiliser la méthode Tranfert() de la classe d'upload.

    Enfin pour être complet, si j'appliquais directement la méthode setChmod() sans contrôle préalable et juste après la méthode export() dans le script d'upload des photos, c'est que le code est dans un bloc try/catch et que les méthodes de la classe ImgGD() renvoient des exceptions en cas d'erreur donc on se retrouve dans le catch dès la première erreur, avant de rencontrer la méthode setChmod().


    Laisses un mot ici si tout fonctionne comme tu veux, j'ajouterai les codes d'upload pour exemple, en prenant soin de supprimer toutes les lignes vides dans le code php ou éventuellement en testant un autre formatage pour que l'on puisse faire du copier/coller.

    Voilà. Je te souhaite de bonnes fêtes de fin d'année.

  10. #290
    Membre à l'essai
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2022
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2022
    Messages : 15
    Points : 18
    Points
    18
    Par défaut
    Bonjour,

    J'ai tout installé et juste modifié le chemin
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $_SESSION['dir_Media_video'] = $dossier_destination = isset($_SESSION['dir_Media_video']) ? $_SESSION['dir_Media_video'] : '';
     
    // Au cas où l'on aurait oublié le slash final on le rajoute (on compare $dossier_destination avec sa valeur amputée de l'éventuel slash final supprimé avec rtrim)
    $dossier_destination = "../../acces_adherents/".$dossier_destination == rtrim("../../acces_adherents/".$dossier_destination, '/') ? "../../acces_adherents/".$dossier_destination.'/' : "../../acces_adherents/".$dossier_destination;
    // Note: si $dossier_destination est initialement vide, il sera donc égale à "/" après le traitement ci-dessus, d'où le contrôle $dossier_destination == '/' plus bas.
    car j'avais déjà modifié le chemin location de la $_SESSION['upload_location_href_video'] pour mes essais antérieurs;

    ça marche super bien !

    Bonnes fêtes

  11. #291
    Expert éminent sénior

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

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 382
    Points : 10 410
    Points
    10 410
    Par défaut Upload Ajax/php insertion des formulaires dans une iframe
    Bonjour,

    L'insertion des formulaires dans une iframe est la solution la plus simple lorsque l'on ne maîtrise pas entièrement le code de la page dans laquelle le module d'upload doit être inséré.

    J'ai donné précédemment un exemple pour redimensionner l'iframe en fonction de la hauteur du formulaire (qui peut varier lors d'un upload multiple), en utilisant les fonctions évènementielles qui se déclenchent en fonction du processus d'upload. Cependant cette méthode n'est pas efficace dans tous les cas, par exemple pour les formulaires de création de filigrane qui possèdent des menus interactifs qui modifient la hauteur du formulaire indépendamment des processus d'upload. Dans ce cas ou plus généralement lorsque les formulaires ont des comportements programmés indépendamment des processus d'upload, il serait laborieux d'appeler systématiquement cette fonction de redimensionnement de l'iframe pour chaque évènement susceptible de modifier la hauteur du formulaire.

    Il est donc plus pratique d'utiliser la fonction setInterval afin d'effectuer le redimensionnement de l'iframe et de son conteneur en fonction de la hauteur du formulaire, indépendamment de tout autre processus. Ci-dessous un bloc de code générique que vous pouvez insérer à n'importe quel endroit dans le code javascript de configuration des formulaires, avant ou après l'initialisation de la classe javascript.
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    var config_setDimIframe = true;
    function setDimIframe (iframe,cframe) {
        let h = document.documentElement.offsetHeight;
        iframe.css("height",h);
        if (cframe !== false) {cframe.css("height",h);}
    }
    var iframe = $(window.frameElement);
    if(config_setDimIframe != false && iframe.length){
        $(document.documentElement).css("overflow","hidden");
        var cframe = config_setDimIframe != 'iframeOnly' && iframe.parent().length ? iframe.parent() : false;
        setInterval(setDimIframe,100,iframe,cframe);
    }
    Vous pouvez, soit désactiver cette fonction avec var config_setDimIframe = false (mais ce n'est pas utile dans le sens où elle se déclenchera uniquement si le formulaire est inséré dans une iframe), soit ne redimensionner que l'iframe elle-même en configurant var config_setDimIframe = 'iframeOnly' pour des besoins particuliers.

    Cette fonction sera intégrée dans la prochaine version de la classe javascript, avec l'option de configuration renommée "config.setDimIframe = true;"

    A noter que le formatage css du html contenant le formulaire avec overflow:hidden permet d'éviter l'affichage d'un ascenseur vertical qui pourrait altérer la stabilité de l'affichage à l'intérieur de l'iframe tout au long de l'utilisation du formulaire. Vous pourrez éventuellement accélérer la prise en compte de ce formatage de quelques millisecondes en l'intégrant également dans le css du formulaire, par exemple : html, body {overflow:hidden;}, mais uniquement dans le cas d'insertion dans une iframe car le formulaire ne sera plus scrollable directement.

    Concernant l'intégration de l'iframe dans votre document, le code est basique, il suffit de renseigner l'attribut source pour cibler le formulaire. A supposer que votre script se trouve au même niveau que le dossier "Upload-Ajax-ABCI" dans votre répertoire et que vous vouliez utiliser le formulaire avec création de filigrane :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <div style="position:relative"><iframe src="Upload-Ajax-ABCI/UploadAjaxABCI_Filigrane_multiple.php" style="position:absolute;width:100%;top:0;left:0;border:0;"></iframe></div>
    Ce code est compatible avec les portables pour peu que le formulaire inclus soit "responsive design" et c'est le cas des exemples fournis.

    Important
    J'ai choisi l'exemple d'intégration d'un formulaire permettant de créer des filigrane en mode wysiwyg car vous aurez une petite modification css à faire dans ces formulaires si vous souhaitez les intégrer dans une iframe. En effet les input de type "color" qui permettent de formater la couleur du filigrane ainsi que sa couleur de fond éventuelle, ont actuellement l'attribut style="display:none". Dès lors, les navigateurs comme Chrome ou Edge positionneront le sélecteur de couleur interne du navigateur en haut et à gauche du document, soit hors de portée lors d'un upload multiple si le formulaire est intégré dans une iframe. Il faut donc les réintégrer dans le DOM afin que le sélecteur de couleur se positionne à proximité directe de l'input de type color.

    Rendez-vous dans les formulaires "UploadAjaxABCI_Filigrane_multiple.php" et "UploadAjaxABCI_Filigrane_Crop_multiple.php", puis faites une recherche sur type="color" pour trouver les quatre input correspondants dans le html et supprimer l'attribut style="display:none" de chacun d'entre eux.

    Ensuite, dans le code css en haut de ces deux documents, ciblez le bloc .formajaxabci .fil_param span.color, .formajaxabci .fil_param span.backcolor { et ajouter à la fin de ce bloc, la ligne margin-left:-5px; pour réduire la distance avec les input de type color qui même rendus invisibles, prendront cette fois-ci un peu de place.

    Au dessus de ce bloc css, ajoutez maintenant le nouveau formatage des input de type color, soit :
    Code css : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    .formajaxabci .fil_param input[type=color] {
    	visibility:hidden;
    	border:0;
    	width:0;
    	height:0;
    }

    Au final vous aurez donc :
    Code css : 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
    /* Input de choix de couleurs cachés, ne doit pas être en "display:none" pour un bon positionnement des color picker, notamment avec chrome et Edge */
    .formajaxabci .fil_param input[type=color] {
    	visibility:hidden;
    	border:0;
    	width:0;
    	height:0;
    }	
    /* Span de choix de couleurs, filigrane et fond */
    .formajaxabci .fil_param span.color, .formajaxabci .fil_param span.backcolor {
    	display:inline-block; 
    	height:18px;
    	width:30px;
    	background-color:#000000;
    	vertical-align:middle;
    	border:2px  double #ccc;
    	/* Correction pour tenir compte du formatage des input[type=color] (bloc précédent) qui prennent un peu de place*/
    	margin-left:-5px;
    }
    Attention, ce sera inopérant si vous omettez de supprimer l'attribut sytle="dispaly:none" dans les input de type color.

    Dorénavant les sélecteurs de couleurs avec Chrome ou Edge s'afficheront juste au dessus ou juste en dessous de ces input et non plus dans le coin haut gauche de la page. Cela n'aura pas d'incidence avec Firefox qui utilise une fenêtre volante, visible dans tous les cas de figure.

    Toutes ces modification seront intégrées dans une prochaine version de la classe d'upload.

    En attendant vous pouvez déjà intégrer simplement les formulaires via une iframe basique, en ajoutant dans le code javascript de vos formulaires le bloc javascript cité plus plus, et avec une petite modification complémentaire du css pour les formulaires permettant la création de filigranes. La seule chose à faire ensuite pour finaliser votre processus d'upload, sera de personnaliser le dossier de destination de vos fichiers, voir le mode d'emploi "Mise en production, notes" -> "Externalisation des scripts et des dossiers d'upload" -> paragraphe "B/ Externalisation des dossiers d'upload".

    Module d'upload

    Voilà

  12. #292
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2014
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2014
    Messages : 41
    Points : 39
    Points
    39
    Par défaut Echec du téléchargement. Type de fichier non valide
    Bonjour et merci pour cet excellent travail !
    Je suis en train de parfaire un navigateur (PHP 8.1 et JS) me permettant de transférer (upload et download) des fichiers depuis mon PC vers mon serveur (j'ai un site chez PlanetHoster en mutualisé -adresse dans la signature- dont je me sers également comme cloud pour sauvegarder certains des fichiers de mon PC).
    Jusqu'à présent, je faisais les uploads avec la méthode classique PHP (move_uploaded_file, etc.) avec toutes ses lenteurs et ses erreurs fréquentes dues au débit, à la taille et autres soucis (j'habite un DOM où Internet n'est pas très performant...).
    Ayant découvert votre travail, j'ai remplacé cette partie par vos fichiers suivants (et évidemment les classes et javascript) que j'ai très légèrement adaptés pour mon usage (dossier destination en variable session définie dans le navigateur et affichage css) :
    - UploadAjaxABCI_Custom_VerifFileExist.php
    - Php_Upload/UploadAjaxABCI_Upload_Custom_VerifFileExist.php
    - Php_Upload/UploadAjaxABCI_VerifFileExist.php
    Cela fonctionne parfaitement sauf pour certains fichiers (notamment les MS Office avec extensions à quatre caractères) avec le message d'erreur "Échec du téléchargement. Type de fichier non valide" alors que je n'ai pas fourni de tableau des extensions autorisées étant dans un environnement sécurisé auquel je suis seul à avoir accès.
    Comment résoudre ce problème et faire que tout fichier, quelle que soit son extension, soit chargé ?
    Merci d'avance.

    Je poursuis mes recherches et il semble que l'erreur (deuxième partie du message) ne soit pas due à l'extension mais au type (variable UpAbTypeNonValide) dans le fichier UploadAjaxABCIServer.php fonction verifMimeType() ; la sauvegarde ne serait pas bonne... Mais pourquoi systématiquement sur ces types de fichiers qui par ailleurs ne sont pas corrompus (ils s'ouvrent sans problème avec Excel ou Word).
    Passionné d'anciennes automobiles, j'ai créé un site dédié qui est loin d'être terminé : https://www.anciennes-automobiles.fr

  13. #293
    Expert éminent sénior

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

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 382
    Points : 10 410
    Points
    10 410
    Par défaut
    Citation Envoyé par PhilippeF75 Voir le message
    Bonjour et merci pour cet excellent travail !
    ...
    Cela fonctionne parfaitement sauf pour certains fichiers (notamment les MS Office avec extensions à quatre caractères) avec le message d'erreur "Échec du téléchargement. Type de fichier non valide" alors que je n'ai pas fourni de tableau des extensions autorisées étant dans un environnement sécurisé auquel je suis seul à avoir accès.
    ...
    Je poursuis mes recherches et il semble que l'erreur (deuxième partie du message) ne soit pas due à l'extension mais au type (variable UpAbTypeNonValide) dans le fichier UploadAjaxABCIServer.php fonction verifMimeType() ; la sauvegarde ne serait pas bonne... Mais pourquoi systématiquement sur ces types de fichiers qui par ailleurs ne sont pas corrompus (ils s'ouvrent sans problème avec Excel ou Word).
    Merci, et oui effectivement si tu n'as pas fourni de tableau des extensions autorisées, l'erreur générée provient de la vérification du type mime.

    Tu as trois possibilités pour éviter cette erreur dont deux qui sont directement accessibles dans l'initialisation de la classe php. En scrollant légèrement dans ce lien et en reprenant la configuration avec un tableau :

    1/ Soit tu peux désactiver la vérification du type MIME pour tous les fichiers.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $config = [
    'dossier_destination' => '../mon_dossier/',
    'verif_type_MIME' => false 
    ];
    $up = new UploadAjaxABCIServeur($config);

    2/ Soit tu peux lister les extensions de fichiers pour lesquels la vérification du type MIME ne fonctionne pas (exemple ci-dessous avec des fichiers MTS de streaming) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $config = [
    'dossier_destination' => '../mon_dossier/',
    'verif_type_MIME' => ['except'=>['MTS','m2ts']]
    ];
    $up = new UploadAjaxABCIServeur($config);
    Cette solution est plus sécurisante que la première car les fichiers ayant d'autres extensions seront contrôlés (au cas où tu télécharges un fichier corrompu sans le savoir par exemple).

    3/ Soit tu peux mettre à jour le tableau de correspondance utilisé pour contrôler le type MIME car il est possible que tes extensions ne soient pas présentes ou encore que l'association entre le type MIME et l'extension ait changé.

    Le tableau utilisé est dans le fichier Php_Upload -> Classes -> SymfonyMapType.php et j'ai mis en haut le lien de référence symfony / mime. Donc dans ce lien, tu peux copier le tableau contenu dans la constante private const MAP et le coller en remplacement du tableau contenu dans la fonction public static $map du fichier SymfonyMapType.php (mais ne change pas le nom de ma fonction "public static $map").

    Ce serait le plus sécurisé. Et puis il est bon de mettre ce tableau à jour de temps à autre si l'on veut télécharger tout type de fichier (tout en sachant que certains comme les fichiers de streaming ne sont pas reconnus pour l'instant par php). Si cela ne fonctionne pas et étant donné que tu travailles dans un espace sécurisé tu peux aussi utiliser les méthodes 1 ou 2 (2 de préférence).

  14. #294
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2014
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2014
    Messages : 41
    Points : 39
    Points
    39
    Par défaut
    Merci d'avoir répondu si vite !
    Je teste cela dès que possible (je pense ce week-end) car là, je suis dans la menuiserie...
    Eh oui, à la retraite, on ne s'ennuie jamais !
    Passionné d'anciennes automobiles, j'ai créé un site dédié qui est loin d'être terminé : https://www.anciennes-automobiles.fr

  15. #295
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2014
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2014
    Messages : 41
    Points : 39
    Points
    39
    Par défaut
    J'ai d'abord commencé par la solution n°3 qui me semble la plus "élégante" et la plus sûre ; mais j'ai d'abord vérifié le contenu de la variable $map du fichier SymfonyMapType.php et, en $map[421] figure bien 'application/vnd.ms-excel.sheet.macroenabled.12' => ['xlsm']' qui est également présent sur le site cité.
    J'ai remplacé le contenu de l'une par l'autre pour être sûr, mais évidemment, comme on pouvait s'y attendre compte tenu de cette vérification, ça reproduit la même erreur.
    J'ai également essayé avec 'application/vnd.ms-excel.sheet.macroEnabled.12' => ['xlsm']', pensant que la casse pouvait avoir une incidence (le type MIME est dans la doc officielle avec Enabled et no enabled), mais non, encore la même erreur.
    Il y a donc un souci à creuser dans cette relation type/extension qui est pourtant exacte (j'ai vérifié)...

    Solution n°2 : j'ai donc défini la variable $config ainsi avant d'initialiser la classe UploadAjaxABCIServeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $config = [
        'dossier_destination' => $dossier_destination,
        'verif_type_MIME' => ['except'=>['xlsm']]
        ];
    Cette fois, cela a marché, les fichiers .xlms ont été chargés.
    Je referai donc cela chaque fois qu'un type ne passe pas mais cela reste insatisfaisant, j'aimerais que cela fonctionne sans générer d'exception.
    EDIT : beaucoup d'autres types de fichiers sont refusés alors qu'ils figurent dans $map, notamment les fichiers PHP, JS, CSS, etc.
    Je vais passer à la solution n°1 tant qu'il n'y aura pas de solution pérenne. Dommage...
    Qu'en pense-tu ?

    J'ai fait quelques tests et, il se passe un petit truc très énervant. Les fichiers téléchargés voient leur nom modifié par le remplacement des espaces par des tirets.
    Et je ne veux pas que le nom change. Je n'ai pas encore trouvé où cela se produit...

    Je pense avoir trouvé l'action fautive : il s'agit de la fonction cleanFileName($nom_fichier) du fichier UploadABCITraitServices.php qui, après avoir remplacé les lettres accentuées et d'autres caractères spécifiques par leur équivalent non accentué, remplace tout ce qui n'est pas alphanumérique ou . ou _ ou - par des tirets - dans le nom du fichier : preg_replace('#[^.a-z0-9_-]+#i', '-', $nom_fichier).
    Cela n'est pas acceptable. Si le fichier a un nom autorisé sur l'ordinateur, il doit le conserver une fois uploadé car il peut y avoir des liaisons entre fichiers qui se trouveraient ainsi rompues (ex : les dossiers Excel).
    Je vais modifier cette fonction et tester.
    TEST réussi.
    Passionné d'anciennes automobiles, j'ai créé un site dédié qui est loin d'être terminé : https://www.anciennes-automobiles.fr

  16. #296
    Expert éminent sénior

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

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 382
    Points : 10 410
    Points
    10 410
    Par défaut
    Citation Envoyé par PhilippeF75 Voir le message
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $config = [
        'dossier_destination' => $dossier_destination,
        'verif_type_MIME' => ['except'=>['Excel','xlsm']]
        ];
    Cette fois, cela a marché, les fichiers .xlms ont été chargés.
    Je referai donc cela chaque fois qu'un type ne passe pas mais cela reste insatisfaisant, j'aimerais que cela fonctionne sans générer d'exception.
    Qu'en pense-tu ?
    Salut,

    Le tableau passé en paramètre pour l'index 'except' liste les extensions de fichiers dont le type Mime ne sera pas vérifié, donc tu n'as pas besoin de mettre 'Excel', dans ton cas
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $config = [
        'dossier_destination' => $dossier_destination,
        'verif_type_MIME' => ['except'=>['xlsm']]
        ];
    suffira.

    En faisant une recherche rapide sur le web il semble que ce bug de la base magic de php pour la reconnaissance de fichiers Excel soit connu depuis longtemps, par exemple ici. Un autre exemple plus récent ici propose un hack mais à première vue cela revient à faire des exceptions, donc au final autant utiliser ma solution qui est déjà implémentée.

    Bref, la base de données magique embarquée de PHP n'est pas toujours magique, c'est pour cette raison que j'ai prévu de pouvoir utiliser une autre base magique dans l'initialisation de la classe d'upload en renseignant un index "path_MAGIC_MIME" (en complément ou à la place de l'index 'except'). Concrètement, en reprenant l'exemple du mode d'emploi (lien précédent) qui utilise des deux options de configuration du type mime, cela donnerait :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $config = [
        'dossier_destination' => $dossier_destination,
        'verif_type_MIME' => ["except"=>["MTS","mt2s"],"path_MAGIC_MIME" => "chemin_vers_la_base_magique_non_embarquée"]
        ];

    Mais je ne pourrai pas te renseigner sur la possibilité ou non d'utiliser une autre base magique que celle embarquée car cela relève de l'administration du serveur, donc de ton hébergeur.

    Etant donné que ce n'est pas toujours possible (notamment sur les serveurs mutualisés) et que cette autre base magique risque elle aussi de ne pas reconnaître tous les fichiers, tu comprends mieux pourquoi j'ai créé un index "except" pour exclure certains fichiers du contrôle du type MIME car c'est la seule solution possible dans ce cas de figure, l'autre étant de désactiver totalement la vérification du type mime ce qui serait encore moins sécurisé.

    Cela dit, la première barrière de sécurité est de fournir un tableau d'extensions autorisées. Il faut commencer par là, sinon un fichier exécutable pourrait être chargé en renvoyant le bon type mime, et il serait uploadé, et là c'est un très très gros danger.

    Par ailleurs et puisqu'en matière de sécurité il faut s'attendre au pire, il faut considérer que certains pirates pourraient passer le contrôle du type Mime avec succès tout en fournissant un fichier corrompu. Après le contrôle des extensions, puis le contrôle du type Mime, il faudrait donc utiliser un antivirus pour un maximum de sécurité et ce dernier point fait également partie de l'administration/configuration serveur de sorte que je ne peux pas l'intégrer dans le code. Mais sur le principe, dans le script d'upload du fichier UploadAjaxABCI_Upload_Custom_VerifFileExist.php que tu utilises, il suffirait, dans la condition if($transfert) {... d'utiliser la variable $destination_fichier pour la passer en argument à l'antivirus éventuellement installé sur ton serveur, puis de faire un unlink si l'antivirus ne supprime pas le fichier de lui-même en cas de problème. Certains serveurs le font peut-être automatiquement pour tout upload de fichiers, mais là encore ce n'est pas de mon ressort.

    D'autres solutions peuvent permettre selon les cas, de mieux sécuriser les fichiers uploadés, comme les renommer sur le serveur pour éviter que les pirates puissent deviner leur adresse, possible si tu utilises une bdd pour faire la correspondance entre le nom du fichier original et son nom renommé et à condition que personne ne puisse lire le contenu de ton dossier depuis le web (un fichier "index.php" placé dans ton répertoire fera l'affaire), ou encore placer ton répertoire de destination en dehors de l'arborescence du web. Ces méthodes ne permettent pas d'éviter de télécharger des fichiers corrompus mais de rendre leur exploitation plus difficile.

    Une autre possibilité, plutôt robuste, consiste à ouvrir et faire des opérations sur le fichier en question. Par exemple quand il s'agit d'images, utiliser la lib GD et tenter de faire une optimisation pour le web ou une autre opération qui fera planter la lib GD si le fichier n'est pas une image. En ce sens, tous mes exemples de script qui traitent de redimensionnement / optimisation / recadrage / création de filigranes sont bien sécurisés. Concernant les fichiers Excel il existe PHPExcel, mais il faut pouvoir l'installer, et d'une manière générale ce serait très laborieux/impossible d'utiliser cette méthode pour tout type de fichier.

    Cette liste n'est pas exhaustive. Enfin bref, la sécurité d'un script d'upload ne dépend pas que du script lui-même, mais du contexte d'utilisation et des possibilités pour faire des contrôles complémentaires. Cependant, si ce script n'est accessible que depuis un espace sécurisé (accès après authentification et utilisation de https), tu élimines une grande partie du problème. Je suis allé pratiquement jusqu'au bout de ce que l'on pouvait faire avec le contrôle du type mime en fournissant des options de configuration, le reste ne dépend pas de moi. Par contre si tu es sensible à la sécurité, n'oublies pas le contrôle des extensions, c'est indispensable même si ce n'est pas suffisant.

    Notes que la classe d'upload renvoie "Extension du fichier non valide." pour les erreurs d'extension, et "Type de fichier non valide." pour les erreurs de type Mime (les messages renvoyés sont configurables dans la classe Messages), de sorte qu'il est très facile de faire la distinction entre les deux. Si tu obtiens une erreur de type après avoir vérifié que le fichier est correct et non corrompu en le passant dans un antivirus, c'est donc un problème avec la base magic de Php (et tu sais maintenant quoi faire).


    EDIT : Je n'avais pas initialement vu ton EDIT.


    Je te conseille d'utiliser la solution 2 plutôt que la 1, c'est toujours mieux de connaître les exceptions autorisées. Et encore une fois le bon fonctionnement de la base magic de php dépend de ton serveur, pas du script d'upload.

    J'ai fait quelques tests et, il se passe un petit truc très énervant. Les fichiers téléchargés voient leur nom modifié par le remplacement des espaces par des tirets.
    ...
    Cela n'est pas acceptable. Si le fichier a un nom autorisé sur l'ordinateur, il doit le conserver une fois uploadé car il peut y avoir des liaisons entre fichiers qui se trouveraient ainsi rompues (ex : les dossiers Excel).
    Oui, par défaut, les exemples fournis utilisent la plupart de temps des fonctions de nettoyage pour un maximum de compatibilité, car on souhaite généralement que les fichiers soient accessibles via une URL. Par exemple une très grande majorité de personnes téléchargent des images ou des vidéos qui doivent être accessibles via une URL sinon rien ne s'affichera sur leur site. Or les espaces ne sont pas autorisés dans une URL, ce qui est autorisé sur un ordinateur diffère de ce qui est autorisé sur le web, donc ce que tu trouves inacceptable est très souvent indispensable.

    Cela dit tu n'étais pas obligé de modifier cette fonction de nettoyage, tu aurais mieux fait de ne pas te servir des fonctions qui l'utilisent. Par exemple dans ton script d'upload, la ligne $destination_fichier = $up->getFileDestination(); retourne "$dossier_destination.$fichier nettoyé" (comme indiqué dans le commentaire au dessus). Rien n'interdit de faire
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    $destination_fichier = $dossier_destination.$nom_fichier_originel;
    puisqu'au début du fichier tu sais comment récupérer le nom originel du fichier avec la méthode getParam("name"), ou encore appliquer une fonction de nettoyage de ton cru sur $nom_fichier_originel; pour créer au final $destination_fichier.

    Tu fais comme tu veux mais cela te permettrais de laisser intact la fonction de nettoyage pour l'appliquer au fichiers qui devront être accessibles via une URL, en résumer pour tous les fichiers qui seront utilisés pour construire une page HTML. Pour avoir un code "universel" tu pourrais faire une condition sur l'extension du fichier et construire "$destination_fichier" en utilisant telle ou telle méthode suivant que tu veux garder ou non le nom du fichier originel. J'ajoute aussi que modifier la fonction de nettoyage originale fera buguer de nombreux exemples fournis dont les fichiers doivent être accessibles via une URL, donc évites de modifier les fonctions originelles, et en cas de besoin utilises plutôt celles que tu auras créées en complément, que tu peux mettre dans ton script ou ajouter dans le trait de services.

    Enfin je vois que tu arrives à te débrouiller, ce qui me fait penser que la doc et les commentaires ne sont pas trop mal faits, ce qui n'était pas évident avec toutes les fonctionnalités disponibles. Au passage, n'oublies pas de plussoyer (avec le petit pouce vert) les messages qui t'ont aidés. On ne gagne rien personnellement, mais c'est pratique pour les visiteurs pour savoir que la réponse est utile pour résoudre le problème en question

  17. #297
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2014
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2014
    Messages : 41
    Points : 39
    Points
    39
    Par défaut
    Un grand merci pour toutes ces explications et encore bravo pour ton excellent travail !

    Pour le premier point (liste des extensions exclues de la vérification), je m'en suis aperçu assez vite et je l'avais modifié en lisant ta doc très bien faite, mais tellement fournie et précise qu'obligatoirement, on saute des paragraphes quand on la lit trop vite.

    Je vais suivre tes conseils pour la vérification des extensions et types car on n'est jamais trop prudent, même sur un espace sécurisé dont l'accès est interdit sauf à soi-même. Il y a des sécurités assez performantes chez PlanetHoster (mon hébergeur) et je vais regarder comment en tirer le meilleur profit.

    Pour le nettoyage des fichiers, je vais modifier dans le sens que tu dis, mais encore une fois, la gestion de mon "cloud" m'est réservée et je sais comment nommer les fichiers que j'utilise sous Windows sur mon ordi et qui ne sont que sauvegardés sur le serveur ainsi que les fichiers que j'utilise dans mes sites web. Donc pas de souci là-dessus.

    Encore merci à toi pour ton travail et tes explications ; je regarderai plus tard les autres fonctions de ton ensemble de fichiers.
    Passionné d'anciennes automobiles, j'ai créé un site dédié qui est loin d'être terminé : https://www.anciennes-automobiles.fr

  18. #298
    Expert éminent sénior

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

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

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

    Merci encore pour tes compliments.

    Juste un dernier mot pour dire que la fonction de nettoyage du nom des fichiers ne sert pas uniquement à les rendre accessibles depuis une URL, mais aussi à sécuriser le script. En effet les caractères "../" et "/" permettent de naviguer dans l'arborescence des dossiers d'un site. Quelqu'un de mal intentionné pourrait insérer ces caractères dans un nom de fichier pour poser son fichier où il veut dans ton site, en dehors du dossier de destination initialement prévu, et c'est d'autant plus facile pour les sites créés avec un CMS open source comme Wordpress par exemple, puisqu'un pirate peut connaître précisément l'organisation des dossiers du site. Et comme d'un autre côté ces caractères ne sont jamais utilisés dans un nom de fichier standard cela ne pose aucun problème de faire une fonction pour supprimer les caractères "/" et ".." pour éviter ce problème.

    Mais il existe d'autres caractères qui peuvent poser problème, tous ceux qui peuvent être interprétés par un script. C'est pour cette raison qu'en matière de sécurité on ne raisonne pas en cherchant à interdire tous les caractères dangereux, cela évite d'en oublier et les pirates ont de l'imagination pour créer des combinaisons qui au final pourraient être interprétées, donc on fait une liste de caractères autorisés ce qui est beaucoup plus sécurisé. Bref il faut n'autoriser que les caractères alphanumériques et quelques autres dont on sait qu'ils ne poseront pas de problème comme le "-", et le "." indispensable puisqu'il précédera l'extension. Ajoutes y l'espace pour certains de tes fichiers qui n'auront pas besoin d'être accessibles par une URL et éventuellement le "_" sans danger lui non plus (mais dans une URL, on préfère utiliser le "-" plutôt que le "_" car le "-" est standard et compris comme une séparation entre deux mots, alors que le "_" est indéterminé et créera une URL moins facilement référençable).

    Cela dit, même si ton script d'upload n'est accessible que par toi, il sera néanmoins sur ton serveur et si quelqu'un arrive à pirater ton contrôle d'accès tu seras très mal si tu n'as pas fait des restrictions concernant l'upload des fichiers, en particulier si tu autorises l'upload de fichiers ".php" ou ".js" ou tout autre fichier exécutable qui peut être interprété par le serveur. Ce type de fichiers ne devraient être transférés que par un logiciel FTP de type Filezilla, jamais depuis un script posé sur ton site car ce faisant tu multiplies les possibilités d'accès et donc de piratage (c'est toujours plus sécurisant de ne proposer aucune possibilité d'accès plutôt que de la protéger).

    Donc dans la mesure du possible :
    1/ Fais une liste d'extensions autorisées qui comprend le minimum indispensable et n'autorises surtout pas les exécutables qui peuvent être interprétés par le serveur.
    2/ Exclus du contrôle de type Mime uniquement les fichiers dont tu as vraiment besoin et qui posent problème avec la base magic de php.
    3/ N'autorises que certains caractères pour nommer les fichiers qui seront uploadés.

    Tu peux faire cela avec les fonctionnalités de la classe d'upload, et si besoin créer des fonctions complémentaires personnelles pour des besoins particuliers mais avec précaution en tenant compte des impératifs de sécurité. Pour les contrôles complémentaires, voir les pistes (non exhaustives) énoncées dans mon messages précédent. Enfin voilà, cette fois-ci je crois que j'ai fais le tour de la question.

    Bonne continuation

  19. #299
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2014
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2014
    Messages : 41
    Points : 39
    Points
    39
    Par défaut
    Merci pour tous ces conseils ; j'en ferai cas.
    Passionné d'anciennes automobiles, j'ai créé un site dédié qui est loin d'être terminé : https://www.anciennes-automobiles.fr

+ Répondre à la discussion
Cette discussion est résolue.
Page 15 sur 15 PremièrePremière ... 51112131415

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