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. #301
    Expert confirmé

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

    Côté formulaire j'ai pris le fichier UploadAjaxABCI_Basique. Tu feras donc attention si tu changes de formulaire puisque la configuration javascript que je te donnes ci-dessous requière l'identifiant du formulaire.
    Code javascript : 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
    <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.
     
    // Destination de la requête ajax d'upload
    var destination_ajax = 'Php_Upload/UploadAjaxABCI_Upload_Basique_Controle_bart64.php';
     
    // Initialisation de la classe javascript (destination ajax, identifiant formulaire, identifiant réponse)
    var up = new UploadAjaxABCI(destination_ajax, '#form_base', '#reponse_upload');
     
    // Limite les extensions autorisées aux fichiers 'csv' et 'pdf'
    up.config.filesExtensions = ['csv','pdf'];
     
    // false interdit la soumission du formulaire sans fichier joint
    up.config.submitWithoutFile = false;
     
    // Message qui s'affichera durant le téléchargement des fichiers (&nbsp; pour insérer un espace insécable)
    up.info.status.inProgress = "Traitement en cours, patientez&nbsp;!";
     
    // Supprime le message javascript en cas de succès puisque le serveur renverra des réponses
    up.info.status.ok = '';
     
     
    // Démarrage DOM chargé
    $(function(){up.Start()});
    </script>

    Tu remarqueras dans le code ci-dessus que la destination de la requête AJAX est un fichier que j'ai nommé "UploadAjaxABCI_Upload_Basique_Controle_bart64.php". Mets donc le code php ci-dessous dans un fichier du même nom et que tu mettras dans le répertoire "Php_Upload".
    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
    <?php
    /*
    Gardez à l'esprit que ce script sera appelé plusieurs fois pour le traitement du même post, 
    excepté en cas d'upload simple si la taille du fichier est inférieure à la taille d'un fragment ou si aucun fichier n'est joint.
    
    CONSULTEZ LE MODE D'EMPLOI POUR L'UTILISATION DES METHODES SERVEUR, 
    BON NOMBRE D'ENTRE ELLES DOIVENT ETRE UTILISEES DANS UN ORDRE PRECIS.
    */
     
    // Vous devez vérifier l'existence du dossier ou changer cette adresse 
    /*------------------------------------------------------*/
    $dossier_destination = '../Destination_Upload1/';
    /*------------------------------------------------------*/
     
    // Pour récupérer la variable de session "$_SESSION['UploadAjaxABCI'][$uniqid_form]" qui fait office de token
    session_start();
     
    // Par sécurité on n'autorise que certaines extensions
    $ext_ok = ['csv','pdf'];
     
    // On limite la taille maximale de chaque fichier si besoin
    $max_size = '500 Mo';
     
    // Charge les classes  php avec spl_autoload_register
    spl_autoload_register(function ($class) {require 'Classes/' . $class . '.php';});
     
    /* On peut configurer la classe en envoyant un tableau (voir mode d'emploi: "Configuration serveur -> configuration de la classe d'upload serveur"). 
    Les paramètres du fichier "ParamsDefautServeur.php" seront appliqués pour les paramètres non renseignés.
    
    Cette configuration renverra les messages appropriés en cas d'extension non autorisée, ou si le type mime du fichier 
    ne correspond pas à son extension ou si la taille du fichier dépasse la taille autorisée. 
    Voir le fichier UploadAjaxABCI_Upload_Basique_Controle_Multiple.php pour d'autres possibilités.
    */
     
    $config = [
    	'dossier_destination' => $dossier_destination
    	,'extensions' => $ext_ok
    	,'max_size' => $max_size
    	,'verif_type_MIME' => ['except'=>['csv']] //Si l'on souhaite exclure le contrôle du type MIME pour certaines extensions (ici csv)
    ];
     
    // Initialisation de la classe php d'upload
    $up = new UploadAjaxABCIServeur($config);
     
     
    /* 
    Lors de traitement complémentaire à l'upload on peut gérer les erreurs fatales du serveur
    avec la méthode catchErrorServer. Les éventuelles erreurs fatales à gérer ici sont le dépassement de la capacité mémoire du serveur 
    et du temps maximum autorisé pour l'exécution du script.
    
    Les contenus des messages renvoyés par "SetMessages::get" sont ceux de la classe "Message.php". Faire une recherche par exemple sur "UpAbAllowedMemorySize" 
    dans le fichier "Message.php" du dossier "Classes" inclus dans le dossier "Php_Upload"  pour voir la correspondance. 
    
    Pour personnaliser le message, plutôt que de modifier le contenu de cette classe, il est plus simple d'écrire directement sont propre message,
    par exemple $tab_erreurs['Allowed memory size'] = ['Vous avez explosé la mémoire du serveur, une facture de maintenance vous sera envoyée pour réparation',true];
    */
    $tab_erreurs = [];
    $tab_erreurs['Allowed memory size'] = [SetMessages::get('UpAbAllowedMemorySize'),true];
    $tab_erreurs['Maximum execution time'] = [SetMessages::get('UpAbMaximumExecutionTime'),true];
    $up->catchErrorServer($tab_erreurs);
     
     
    // Décommenter la ligne ci-dessous en phase de développement pour faire afficher les erreurs php dans le formulaire.
    // $up->setModeDebug ();
     
    /* getParam("uniqid_form") renvoie l'identifiant de formulaire pour la vérification ci-dessous
    cf mode d'emploi "Configuration serveur -> Récupération des paramètres Ajax prédéfinis" pour les index disponibles.
    */
    $uniqid_form = $up->getParam("uniqid_form");
     
    /* Il est conseillé (indispensable) de ne pas supprimer cette ligne car c'est le token qui assure que ce script est appelé depuis le formulaire. 
    Permet également de renvoyer un message en cas de timeout du serveur, connexion perdue ou non valide.
    */
    if(!(isset($uniqid_form,$_SESSION['UploadAjaxABCI'][$uniqid_form]['token'])))
    {
    	$up->exitStatusErreur(SetMessages::get('UpAbVerifToken')); 
    }
     
    // Initialise l'upload
    $up->Upload();
     
    // Récupère le fichier lorsqu'il est complet. C'est à l'intérieur de cette condition que tu pourras faire des traitements sur le fichier
    $fichier_complet = $up->getTempAdressFileComplete();
    if($fichier_complet != false)
    {
    	/* 
    	C'est donc $fichier_complet que tu dois utiliser avec les fonctions php fetgetcsv ou encore SplFileObject
    	
    	Si ce même script doit être utilisé pour charger à la fois des fichiers pdf et csv, il faut faire des distinctions pour faire des traitements différents.
    
    	getcleanFileName() récupère le nom du fichier nettoyé, utile pour tes fichiers pdf s'ils doivent être accessibles via une URL, sinon on peut utiliser $up->getParam('name')
    	qui retourne le nom originel du fichier.
    	Enfin peu importe puisqu'ici je cherche à faire un tri sur l'extension 
    	*/
    	$name = $up->getcleanFileName();
    	$extension = $up->getExtension($name);
     
    	if($extension == 'csv') {
     
    		/* Prépare une requête avec la classe pdo intégrée
    		Pour qu'elle fonctionne, tu dois renseigner tes propres valeurs de connexion dans la méthode "getParamConnectBdd" 
    		de la classe "ParamsDefautServeur" qui est inclue dans le dossier "Classes" du dossier "Php_Upload"
    		*/ 
    		try
    		{
    			$dbh = C_PDO::getC();
     
    			// Ma table se nomme "test_bart" et comprend trois champs "Nom", "Prenom", "Telephone"
    			$insert = $dbh->prepare("INSERT INTO test_bart (Nom, Prenom, Telephone) VALUES (?, ?, ?)");
     
    			// Prépare la lecture du fichier csv
    			$file = new SplFileObject($fichier_complet);
     
    			// Configure pour la lecture d'un CSV et pour ignorer les lignes vides
    			$file->setFlags(
    				SplFileObject::READ_CSV |
    				SplFileObject::SKIP_EMPTY |
    				SplFileObject::DROP_NEW_LINE |
    				SplFileObject::READ_AHEAD
    			);
     
    			// Si format français le séparateur est un point virgule, l'enclosure est '"' et escape est vide (qu'il faut spécifier pour compatibilité php 8.4)
    			$file->setCsvControl(';','"','');
     
    			$row_count = 0;
     
    			// Liste le csv en hydratant la bdd, suppose que les champs csv sont dans le même ordre que ceux de la bdd
    			foreach ($file as $row) {
     
    				list($param1, $param2, $param3) = $row;
     
    				// Eventuellement pour voir les lignes en phase de débug, décommentes la ligne ci-dessous (le script s'arrêtera et renverra la valeur)
    				//$up->exitStatusErreur(var_dump($row));
     
    				// Hydrate la bdd
    				$insert->execute([$param1, $param2, $param3]);
     
    				// Pour compter le  nombre de lignes insérées
    				$row_count += $insert->rowCount();
    			}
     
    			// Envoie un message dans le html avec le nombre de lignes mises à jour
    			$up->addStatusOk("Traitement terminé. ".$row_count." lignes ont été insérées.");
     
    			/* Le fichier csv est exploité et n'a plus d'utilité, on n'utilisera pas la fonction Transfert () qui transfère le fichier ver son emplacement définitif,  renseigne le status javascript, et efface le fichier temporaire et le cookie de sauvegarde.
    			On utilisera donc à la place des fonctions dédiées pour renseigner le retour javascript (indispensable pour la bonne continuité du script) et pour supprimer le fichier temporaire.
    			*/
    			// Status ok pour renseigner le retour javascript
    			$up->setTransfertOk();
     
    			// Efface le fichier et le cookie de sauvegarde
    			$up->deleteFileTempCookie();
     
    		}
    		// Retourne les erreurs pdo
    		catch(PDOException $e)
    		{
    			/* 
                            A noter que la méthode exitStatusErreur() sort du script dès qu'elle est appelée. 
                            Si l'on souhaite supprimer le fichier temporaire, ce qui est logique en cas d'erreur, il faut donc le supprimer avant d'appliquer la méthode exitStatusErreur().
    			*/
     
    			// Efface le fichier et le cookie de sauvegarde
    			$up->deleteFileTempCookie();
     
    			/* remplacer la ligne ci-dessous par 
    			$up->exitStatusErreur(SetMessages::get('UpAbConnectBdd')); 
    			en dehors des phases de débug pour éviter de renseigner les visiteurs sur la structure de la bdd
    			*/
    			$up->exitStatusErreur($e->getMessage());
    		}
    		// Retourne les autres erreurs (donc celles générées par SplFileObject)
    		catch(Exception $e)
    		{
    			// Efface le fichier et le cookie de sauvegarde
    			$up->deleteFileTempCookie();
    			// Sort du script en renvoyant le message d'erreur
    			$up->exitStatusErreur($e->getMessage());
                   }		
    	}
     
    	else if ($extension == 'pdf') {
    		/* Transfert() attend comme argument le chemin complet de destination du fichier, si non renseigné ce sera 
    		$dossier_destination.$nom_fichier_nettoyé ou encore "$up->getFileDestination()" qui retourne la même valeur
    		*/
    		// Ci-dessous je teste l'adresse du fichier $pdf pour éviter d'écraser des fichiers de même nom déjà existants
    		if(!is_file($up->getFileDestination())) {
     
    			$tranfert = $up->Transfert();
    			if($tranfert) {
     
    				$up->addStatusOk("Votre fichier PDF a été chargé avec succès");
     
    				// Si besoin pour définir le chmod par exemple 0604
    				$up->setChmod($up->getFileDestination(), 0604);
     
                                   // (pas besoin de supprimer le fichier temporaire et le cookie de sauvegarde puisque la méthode Transfert() le fait automatiquement
    			}
    		}
    		else { // Si le fichier existe déjà
     
     			// Efface le fichier et le cookie de sauvegarde
    			$up->deleteFileTempCookie();
    			// Sort du script en renvoyant un message d'erreur
    			$up->exitStatusErreur("Ce fichier existe déjà");
     
    		}
    	}
    }
     
    // Indispensable dans tous les cas de figure, renvoie les informations à javascript
    $up->exitReponseAjax();
    ?>

    Lis bien les commentaires. Il faudra renseigner tes paramètres de connexion bdd (pour utiliser la classe C_PDO), et bien sûr adapter la requête suivant ta table et tes champs, ainsi que le nombre de variables dans la ligne list($param1, $param2, $param3) = $row; et de même dans la ligne $insert->execute([$param1, $param2, $param3]);.

    J'ai testé ce code et si tu télécharges un fichier PDF il sera bien téléchargé dans le répertoire "Destination_Upload1", et si tu télécharges un fichier CSV (mon fichier de test provient de libre office) ce fichier hydrate bien les trois champs "Nom", "Prenom" et "Telephone" de la table "test_bart".

    Concernant la barre de progression, on n'y touche pas (ce n'est pas pas prévu pour ça) mais tu verras qu'en contre partie le code javascript est configuré pour afficher un message "Traitement en cours, patientez !" durant tout le téléchargement y compris durant le traitement des fichiers (à condition que l'upload + le traitement ne soient pas instantané), et est remplacé par un message de succès quand tout est terminé.

    Enfin si tu veux que les messages d'erreur s'affichent en rouge, tu peux remplacer la ligne du formulaire (qui actuellement affiche uniquement les messages de succès en vert)
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <span class="UpAbci_status" data-upabcicss-result-ok="color:green;font-weight:bold">en attente</span>
    par
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
     <span class="UpAbci_status" data-upabcicss-result-ok="color:green;font-weight:bold" data-upabcicss-result-error="color:red;font-weight:bold">en attente</span>

  2. #302
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 277
    Par défaut
    Merci ABCIWEB pour cette réponse et pour avoir pris le temps de me mettre le code, c'est tout bon pour moi !

    Ce module est vraiment top, il est très bien documenté et super bien écrit.

    Je vais me permettre une dernière question stp : dans ma page qui contient le input file et le bouton d'envoi du fichier, comment puis-je détecter la fin de l'upload du fichier ?
    Il faudrait que je lance un traitement dès que le statut de l'upload est OK.

    Je te remercie, ça devrait être ma dernière question.

    Bon dimanche

  3. #303
    Expert confirmé

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

    Merci pour les compliments.

    Côté formulaire, tu peux te servir des fonctions évènementielles pour connaître en retour l'état de traitement des fichiers, notamment la fonction config.func_FormEnd qui en premier paramètre renvoie un tableau de tableaux, un tableau pour chaque fichier, ou encore la fonction config.func_FileEndEach qui s'exécute à la fin du traitement de chaque fichier.

    Les objet retournés dans ce premier paramètre sont listés ici, tu pourras donc tester si result == 'ok_done' pour confirmer le bon traitement de ton ou tes fichiers, un exemple d'application est donné entre autre dans le fichier "UploadAjaxABCI_Custom.php" pour compter le nombre de fichiers traités ok.

    Mais tu pourrais aussi te servir de la méthode addMixteServer côté Php pour renvoyer un message ou tableau personnalisé que tu pourras récupérer en troisième paramètre des fonctions évènementielles précédemment citées. Cherches dans les fichiers d'exemples, le fichier "UploadAjaxABCI_Champs_Sup_Notation.php" utilise cette fonction côté serveur et est récupéré en javascript pour faire différents affichages, mais tu pourrais t'en servir pour déclencher une action (éventuellement différente suivant ce que tu retournes comme info depuis le serveur).

    Sinon évidemment s'il s'agit d'un traitement php sur le fichier tu pourrais tout aussi bien faire ce traitement côté php en utilisant $fichier_complet.

    Je ne peux pas t'en dire plus sans informations complémentaires sur ce que tu veux faire exactement. Enfin je t'ai laissé un message ici, si tu ne respectes pas les règles des forums d'entraide on finira vite par ne plus te répondre car si tu ne prends pas le temps minimum pour t'y conformer, on n'en prendra pas non plus pour t'aider

  4. #304
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 277
    Par défaut
    Merci pour toutes ces informations, je n'ai pas encore réussi à le mettre en place parce que je suis un peu perdu.
    Mon objectif est d'afficher une div qui est "display: none" par défaut dans le formulaire dès que le traitement est terminé côté serveur.
    Je reviendrai vers toi dès que j'aurai trouvé.

    Je suis désolé, je ne connaissais pas cette règle mais je vais me remettre à jour. J'ai mis mon "plus" sur tous les autres messages auxquels tu m'as répondu.

    Bonne soirée

  5. #305
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 421
    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 421
    Par défaut
    Citation Envoyé par bart64 Voir le message
    Merci pour toutes ces informations, je n'ai pas encore réussi à le mettre en place parce que je suis un peu perdu.
    Mon objectif est d'afficher une div qui est "display: none" par défaut dans le formulaire dès que le traitement est terminé côté serveur.
    Je reviendrai vers toi dès que j'aurai trouvé.
    Houla! tu aurais dû me le dire dès le départ, car pour afficher une div il y a beaucoup plus simple. En complément des fonctions javascript évènementielles (puissantes mais qui nécessitent javascript), le module d'upload propose aussi des styles évènementiels. Et donc tu peux afficher/masquer, changer la couleur etc., bref appliquer n'importe quel style sur un bloc html en fonction de l'évolution du traitement des fichiers, très simplement en intégrant des règles de styles dans le html.

    Concrètement si tu veux faire afficher un div à la fin du traitement serveur, cela donne:
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <div style="display:none" data-upabcicss-upload-end="display:block;">ma div perso que je veux faire afficher à la fin du traitement</div>
    Lis bien les quatre paragraphes du chapitre "Styles événementiels" dans le lien que je t'ai donné plus haut pour tout comprendre du fonctionnement.

    Il y a aussi un exemple dans le tuto et beaucoup d'autres dans le fichier d'exemple UploadAjaxABCI.php.

    Citation Envoyé par bart64 Voir le message
    Je suis désolé, je ne connaissais pas cette règle mais je vais me remettre à jour. J'ai mis mon "plus" sur tous les autres messages auxquels tu m'as répondu.
    Bah c'est une règle implicite sur les forums d'entraide. Moi qui ai quasiment tout appris sur le web, j'ai été bien aidé de voir plus rapidement les réponses pertinentes avec ce système. Si tu fais des recherches sur un sujet et que tu tombes sur un topic où il faut tout lire en détail pour savoir si quelque chose est intéressant, tu y passes des plombes. Etre guidé par un système de notation fait gagner énormément de temps. Cela ne sert ni à toi ni à moi, mais aux futurs lecteurs (qui gagneront eux-mêmes d'autant plus de temps qu'ils n'auront pas besoin de poser la question dans un forum).

    Oui donc ce n'est pas "mes messages" qu'ils faut plussoyer mais tous les messages qui t'ont aidé pour trouver la solution. C'est ainsi que tu faciliteras la recherche des prochains lecteurs en les orientant plus facilement

  6. #306
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 277
    Par défaut
    C'est tout bon, ça a fonctionné avec le bout de code que tu m'as donné :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <div class="preview-section" id="previewSection" style="display: none" data-upabcicss-upload-end="display:block;">
    J'ai compris mon erreur (précédemment), je n'avais pas placé les éléments à l'intérieur de la form et ça ne fonctionnait pas.

    Alors, en codant, je me suis aperçu que la solution de l'attribut data-upabcicss-upload-end n'était finalement pas la meilleure dans mon cas parce que lorsque l'utilisateur sélectionne un autre fichier, il faut que je cache à nouveau ma div. Etant donné que j'ai maintenant tous mes éléments dans la form, j'ai pu utiliser l'autre bout de code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    //traitement qui s'exécute quand le fichier a fini d'être uploadé
    up2.config.func_FormEnd = function(tableau, info_server)
    {
        var previewSection = document.getElementById('previewSection'); // Remplace par l'ID de ta div cachée
        var fileInput = document.getElementById('fileUpload');
        previewSection.style.display = 'block'; // Affiche la div si un fichier est sélectionné
    }
    Merci beaucoup pour tout le temps que tu as pris pour me répondre, c'est très apprécié. Grâce à toi et à ton module, j'ai quelque chose qui fonctionne très bien, et c'est pro.

    Bah c'est une règle implicite sur les forums d'entraide. Moi qui ai quasiment tout appris sur le web, j'ai été bien aidé de voir plus rapidement les réponses pertinentes avec ce système. Si tu fais des recherches sur un sujet et que tu tombes sur un topic où il faut tout lire en détail pour savoir si quelque chose est intéressant, tu y passes des plombes. Etre guidé par un système de notation fait gagner énormément de temps. Cela ne sert ni à toi ni à moi, mais aux futurs lecteurs (qui gagneront eux-mêmes d'autant plus de temps qu'ils n'auront pas besoin de poser la question dans un forum).
    Tu as raison, quand je fais des recherches, je chercher immédiatement les réponses qui sont validées, c'est très pratique. Je n'avais pas pensé à m'appliquer cette règle et le bouton sur developpez.net m'avait échappé.
    Ca deviendra un réflexe

    Je te souhaite un excellent WE.

  7. #307
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 421
    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 421
    Par défaut
    Citation Envoyé par bart64 Voir le message

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <div class="preview-section" id="previewSection" style="display: none" data-upabcicss-upload-end="display:block;">

    J'ai compris mon erreur (précédemment), je n'avais pas placé les éléments à l'intérieur de la form et ça ne fonctionnait pas.

    Alors, en codant, je me suis aperçu que la solution de l'attribut data-upabcicss-upload-end n'était finalement pas la meilleure dans mon cas parce que lorsque l'utilisateur sélectionne un autre fichier, il faut que je cache à nouveau ma div.
    Dans ce cas tu aurais sans doute pu ajouter un second style évènementiel qui cache la div dès que l'on sélectionne un fichier:
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <div class="preview-section" id="previewSection" style="display: none" data-upabcicss-upload-end="display:block;"   data-upabcicss-select-file="display:none;">

    Après si ce que tu as fait fonctionne correctement, pas la peine de changer, cela dit je note une bizarrerie dans ton code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    //traitement qui s'exécute quand le fichier a fini d'être uploadé
    up2.config.func_FormEnd = function(tableau, info_server)
    {
        var previewSection = document.getElementById('previewSection'); // Remplace par l'ID de ta div cachée
        var fileInput = document.getElementById('fileUpload');
        previewSection.style.display = 'block'; // Affiche la div si un fichier est sélectionné
    }
    Au niveau des commentaires c'est relativement inexact. La fonction "config.func_FormEnd" se déclenche à la fin du traitement du formulaire, c'est à dire après le dernier fichier traité et il peut y en avoir plusieurs en cas d'upload multiple si l'utilisateur sélectionne plusieurs fichiers simultanément.

    Mais effectivement, si dans ton formulaire tu as supprimé l'attribut "multiple="multiple"" que j'ai mis par défaut dans quasiment tous les formulaires dans l'input de type "file", alors effectivement cette fonction sera déclenchée à la fin du traitement du premier fichier puisque l'utilisateur ne pourra n'en sélectionner qu'un.

    Je te précise cela car il faut être rigoureux quand on fait de la programmation évènementielle sinon on a vite fait de se perdre sans comprendre ses erreurs.

    Mais la bizarrerie que l'ai repérée dans ton code est le fait que tu définis dans ta fonction une variable "fileInput" que tu n'utilises pas. Peut-être inutile...

    Dernière précision, cette fonction .config.func_FormEnd se déclenche à la fin du traitement du fomulaire quelque soit le résultat du traitement des fichiers (tout comme le style évènementiel data-upabcicss-upload-end). C'est à dire y compris si le traitement d'un fichier est en erreur.

    Dans le cas où tu voudrais ne faire afficher ton div que si le fichier est traité correctement, tu pourrais faire:

    Code javascript : 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
    up2.config.func_FormEnd = function(tableau, info_server)
    {
    	//console.log(tableau);
    	/* De nombreuses informations sont disponibles dans le paramètre "tableau" qui est un tableau d'objets, 1 objet pour chaque fichier)
    	Dans le cas particulier où un seul fichier est traité, inutile de faire une boucle pour lister tous les objets des fichiers, l'objet du fichier unique est dans tableau[0]
    	*/
    	if(tableau[0]) {
     
    		var  file = tableau[0];
     
    		/* Voir https://abciweb.developpez.com/tutoriels/module-upload-ajax-php/mode-emploi-outil-upload-ajax-php.html#tableaux_fjev  
    		pour les paramètres disponibles et leur signification
    		*/
     
    		// Ici je fais une condition si le fichier est correctement traité (sans erreur)
    		if(file.result == "ok_done") {
    			// Puisque le script utilise jQuery tant qu'à faire j'utilise la syntaxe jQuery un peu plus courte que celle de javascript: $('#previewSection') = document.getElementById('previewSection')
    			var previewSection = $('#previewSection');
                           //syntaxe jQuery pour appliquer des styles sur les objets jQuery
    			previewSection.css("display","block"); 
    		}
    	}
    }

    Voilà tout l'intérêt des fonctions évènementielles, on a beaucoup plus d'informations en retour et d'interactions possibles avec le serveur qu'avec les styles évènementiels, sans compter que l'on peut déclencher d'autres scripts.

    Citation Envoyé par bart64 Voir le message
    Tu as raison, quand je fais des recherches, je chercher immédiatement les réponses qui sont validées, c'est très pratique. Je n'avais pas pensé à m'appliquer cette règle et le bouton sur developpez.net m'avait échappé.
    Ca deviendra un réflexe
    A ce propos, tu as oublié ce message qui inclus en fait tout le code de l'upload

    Bon fin de week-end à toi aussi

  8. #308
    Invité de passage
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2018
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Congo-Brazzaville

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2018
    Messages : 1
    Par défaut problème lors de l'envoi de certains fichiers
    upload AJAX-PHP ABCI sur certains fichier l'upload s'arrête avec l'erreur : Echec du téléchargement. Erreur non documentée.

  9. #309
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 421
    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 421
    Par défaut
    Citation Envoyé par Orient Voir le message
    upload AJAX-PHP ABCI sur certains fichier l'upload s'arrête avec l'erreur : Echec du téléchargement. Erreur non documentée.
    Bonjour,

    C'est une erreur dans la gestion des messages, le script appelle un message qui n'est pas documenté (n'existe pas) dans la classe Php_Upload->Classes->Message.php.

    Dans ton script côté serveur php (c'est à dire le fichier d'upload php situé dans le dossier Php_Upload, qui est la destination de la requête Ajax du formulaire), les appels sont faits avec SetMessages::get('Une référence de message'). C'est une de ces références qui est fausse.

    Quel fichier d'exemple utilises-tu ? L'as-tu modifié ? Obtiens-tu la même erreur si tu changes de fichier d'exemple ? Il faut être plus précis si tu veux que je puisse t'aider d'avantage.

  10. #310
    Invité de passage
    Homme Profil pro
    Webmaster
    Inscrit en
    Septembre 2018
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Septembre 2018
    Messages : 1
    Par défaut Téléchargement multiple.
    Bonjour,

    Je viens de mettre en place la dernière version de 2022 et je constate que la possibilité de télécharger en même temps plusieurs fichiers n'a pas été réactivée. Est-ce une sécurité introduite par ? Une mise à jour à envisager ?

    Merci

  11. #311
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 421
    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 421
    Par défaut
    Bonjour,

    Il n'y a pas de restriction particulière dans la dernière version.

    C'est l'attribut multiple="multiple" inclus dans l'input de type file du formulaire, qui autorise ou non (si absent) la possibilité de faire des uploads multiples.

    En prenant le ficher d'exemple "UploadAjaxABCI_Basique.php" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <input type="file" name="upload_base" multiple="multiple">
    Quel fichier d'exemple utilises -tu ?


    P.S : Par acquis de conscience, je viens d'essayer avec la dernière version php à ma disposition, soit php 8.5.6 et ça fonctionne correctement, y compris l'upload multiple.

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

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: 9
    Dernier message: 18/06/2024, 22h26
  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