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. #121
    Expert éminent sénior

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

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Version 6.3c en ligne

    Pas de modification du code de la classe javascript et des classes php.

    Petite correction du fichier d'exemples "UploadAjaxABCI.php" et de son fichier de destination ajax "UploadAjaxABCI_Php_Load.php" : le deuxième formulaire de ce fichier qui impose une limite de 100Mo n'était pas correctement contrôlé côté php (le nom du champ contrôlé n'était pas le bon). C'était sans incidence directe puisque le premier contrôle fait en javascript fonctionnait correctement mais cependant insuffisant pour un contrôle sécurisé qui doit toujours être doublé côté serveur.

    Quelques corrections orthographiques et précisions ont été ajoutées dans le mode d'emploi. J'en ai profité pour ajouter un paragraphe pour une configuration type chez Free puisque ce FAI propose une mise à jour vers Php 5.6 depuis cet été ce qui permet donc l'utilisation de ce module d'upload qui requière php 5.4 minimum (et est compatible php 7). Cela dit, rien n'empêche d'utiliser la classe javascript avec une autre technologie côté serveur mais dans ce cas vous devrez créer le code serveur, alors qu'avec Php les exemples sont directement fonctionnels en déposant simplement le dossier sur le serveur.

  2. #122
    Candidat au Club
    Homme Profil pro
    Analyse système
    Inscrit en
    Décembre 2016
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Décembre 2016
    Messages : 2
    Points : 2
    Points
    2
    Par défaut impossible de lire le fichier
    Le fichier une fois télécharger est au format "bien". Ya Tim un lien valide? Pour l telechargement

  3. #123
    Expert éminent sénior

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

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

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

    Le lien vers la page de téléchargement est sur le titre des versions annoncées, je le redonne ici.

    Ensuite il faut être connecté à son compte (inscription gratuite) puis cliquer sur le gros bouton vert de téléchargement intitulé "Télécharger Classe Javascript + Classes Php + Dossier de test prêt à l'emploi - version 6.3c". Un popup de téléchargement propose de télécharger le fichier "Upload-Ajax-ABCI-v6.3c.zip", cliquer sur enregistrer, c'est tout.

    Enfin pas tout à fait puisque c'est un fichier compressé au format "zip" qu'il faut donc dézipper : dans l'explorateur de fichiers window il suffit de cliquer sur ce fichier, l'outil de décompression devient visible en haut de la fenêtre, cliquer dessus puis sur "extraire tout". Une fenêtre s'ouvre pour demander où tu souhaites décompresser l'archive (par défaut ce sera dans le même dossier), il te suffit de cliquer sur "extraire". A la fin de l'extraction tu obtiens un dossier nommé "Upload-Ajax-ABCI-v6.3c" dans lequel se trouve un dossier nommé "Upload-Ajax-ABCI". C'est ce dossier "Upload-Ajax-ABCI" qu'il suffit de copier sur le serveur pour pouvoir tester les exemples fournis. Le mode d'emploi est la page "index.html".

    Si tu possède une vieille version de windows qui ne propose pas d'utilitaire de décompression tu peux télécharger celui-ci qui est gratuit. Pour un autre système d'exploitation se renseigner avec les mots clefs "décompression de fichiers zip".

    Voilà je peux pas t'en dire plus, je viens de faire le test et tout est ok. Il faut être plus précis dans ta question s'il s'agit d'autre chose.

  4. #124
    Candidat au Club
    Homme Profil pro
    Analyse système
    Inscrit en
    Décembre 2016
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Décembre 2016
    Messages : 2
    Points : 2
    Points
    2
    Par défaut impossible a lire
    Pour être plus clair , le fichier télécharger est sous l'extension ".bon" et non pas ".ZIP" donc peut terre que ça marche chez vous mais avec des PC différent jai le mem rrsultat

  5. #125
    Expert éminent sénior

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

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

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

    Avec Firefox, quand je cliques sur le gros bouton vert de cette page, j'ai une fenêtre de dialogue qui s'affiche avec :
    Vous avez choisi d'ouvrir:
    Upload-Ajax-ABCI-v6.3c.zip
    qui est un fichier de type: Compressed (zipped) Folder
    à partir de : http://javascript.developpez.com
    Que doit faire Firefox avec ce fichier ?
    ...
    (il faut cocher la case "Enregistrer le fichier")
    Et toi qu'obtiens-tu ?

  6. #126
    Community Manager

    Profil pro
    Inscrit en
    Avril 2014
    Messages
    4 207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2014
    Messages : 4 207
    Points : 13 061
    Points
    13 061
    Par défaut
    Chers membres du club,
    Je vous présente ce tutoriel de Alain Bontemps pour apprendre à configurer et utiliser un outil complet programmé en Ajax et PHP pour l'upload de fichiers.

    Solution complète d'upload Ajax-jQuery avec classes PHP serveur. Informations en temps réel, styles et fonctions JavaScript événementiels, file d'attente et fragmentation.
    Bonne lecture et n'hésitez pas à apporter vos commentaires


    Retrouvez les meilleurs cours et tutoriels pour apprendre la programmation Web
    Retrouvez les meilleurs cours et tutoriels pour apprendre la programmation PHP
    Pour contacter les différents services du club (publications, partenariats, publicité, ...) : Contacts

  7. #127
    Membre expérimenté
    Avatar de Jarodd
    Profil pro
    Inscrit en
    Août 2005
    Messages
    851
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 851
    Points : 1 717
    Points
    1 717
    Par défaut
    Bonjour,

    Merci pour le tuto.
    La licence est indiquée "Libre", sans détail. On pourrait en savoir plus ?

  8. #128
    Expert éminent sénior

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

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

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

    Bonne question à laquelle je ne m'étais pas encore intéressé.

    Je viens de mettre "creative common" et plus exactement je vais trouver un moyen d'indiquer creative common BY SA (Attribution + Partage dans les mêmes conditions).

    C'est à dire que l'on peut l'intégrer dans tout type de site commercial ou non. La seule restriction est de ne pas s'en servir pour la revendre dans un module spécifiquement dédié à l'upload de fichiers.

    J'espère avoir bien compris le système de ces licences. Dites-moi si cela ne correspond pas où si cela pose un problème. La seule chose que je ne veux pas c'est qu'on vende directement ce que j'ai créé (dans ce cas j'aimerais bien participer aux bénéfices). A part ça on peut bien entendu s'en servir pour l'intégrer comme module d'upload dans un site que l'on pourra vendre.

  9. #129
    Membre expérimenté
    Avatar de Jarodd
    Profil pro
    Inscrit en
    Août 2005
    Messages
    851
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 851
    Points : 1 717
    Points
    1 717
    Par défaut
    On ne peut pas séparer la vente directe et l'intégration à un site commercial
    S'il est intégré à un site commercial et que tu l'as autorisé, ça participe indirectement aux bénéfices, mais tu n'en auras pas ta part.

  10. #130
    Expert éminent sénior

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

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Citation Envoyé par Jarodd Voir le message
    S'il est intégré à un site commercial et que tu l'as autorisé, ça participe indirectement aux bénéfices, mais tu n'en auras pas ta part.
    C'est pas un problème. Comme toute contribution, c'est fait pour rendre service à celui ou celle qui l'utilise.

    Quand on utilise une librairie comme jQuery par exemple, on ne paye pas de droit d'utilisation. Par contre on a pas le droit de télécharger le fichier jQuery puis de le mettre en vente en tant que lib javascript. C'est la clause SA : partage dans les mêmes conditions.

    Donc cela n'interdit pas non plus de diffuser cette librairie d'upload, mais uniquement dans les mêmes conditions que les conditions initiales, soit partage gratuit, sinon il faut demander l'autorisation. Mais en aucun cas cela n'empêche son utilisation dans des sites commerciaux.

  11. #131
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 40
    Points : 40
    Points
    40
    Par défaut
    Bonjour,

    Tout d'abord merci pour ces classes très pratiques et performantes.
    J'envisage de les utiliser en remplacement du système de "base" de fichiers d'upload par php.

    En ce moment j'ai parfois des fichiers qui après le "move_uploaded_file" ont une taille de 0 sans savoir pourquoi.

    Par contre, les fichiers à uploader, qui sont des images (dont 1 obligatoire et jusqu'à 6 facultatives), viennent en complément d'un formulaire plus classique mais avec pas mal de validations via jQuery Validation Engine (https://github.com/posabsolute/jQuery-Validation-Engine). Je me demande donc si je peux utiliser vos classes en même temps, sachant qu'une image est obligatoire, et qu'il y en ait une ou plusieurs, doivent avoir la même base de nom de fichier (par exemple $timestamp + '_' + $i + '.jpg').

    Merci.

  12. #132
    Expert éminent sénior

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

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

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

    Pour l'utilisation avec jQuery Validation Engine c'est sans doute possible mais faudrait tester pour voir. Cela dépend s'il n'y aura pas de conflit pour le contrôle du formulaire avec la classe d'upload javascript. Mais bon avec le nombre d'options disponibles dans les deux modules on devrait trouver une solution en cas de problème. Au pire on pourrait envisager de séparer en deux formulaires, un contrôlé par jQuery Validation Engine et l'autre contrôlé par la classe d'upload, le premier envoyant automatiquement le second au retour de validation et donc de façon transparente pour l'utilisateur qui ne verrait qu'un formulaire.

    Sinon j'ai donné un exemple de validation de formulaire dans le fichier "UploadAjaxABCI_Inscription_Photo_Crop.php". Il y a les contrôles direct en javascript et les contrôles par requête ajax donc c'est assez complet et cela pourrait t'éviter d'utiliser jQuery Validation Engine. Ce serait peut-être encore le plus simple/rapide.

    Concernant l'obligation de joindre un fichier au formulaire, il y a l'option "config.submitWithoutFile" que tu pourras mettre à false pour ne permettre l'envoi du formulaire que si un fichier est joint et tu pourras faire afficher un message si besoin.

    Concernant le nom des fichiers y'a pas de problème non plus puisque tu peux les définir côté serveur en passant le chemin du fichier avec son nom dans la fonction "Transfert()". Tu peux mettre $timestamp dans un champ de formulaire que tu récupéreras côté serveur. Ensuite pour faire l'incrémentation tout dépend comment tu stockes tes fichiers mais si tu les enregistre en bdd tu peux faire une requête pour trouver le nombre de fichiers déjà enregistrés sur l'item pour calculer ton incrément. Ou sinon enregistrer ton incrément dans une variable de session ex $_SESSION[$timestamp] puis l'incrémenter à chaque nouveau fichier terminé (tu peux savoir si un fichier est terminé avec la fonction serveur "getTempAdressFileComplete()".

    Bref il y a de nombreuses possibilités mais il faudrait que tu avances un peu plus pour me poser des questions plus précises. Sinon sur le principe de ce que tu veux faire, y'a pas de soucis, y'a tout ce qu'il faut

  13. #133
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 9
    Points : 11
    Points
    11
    Par défaut Upload
    Bonjour,

    Merci déjà pour ce partage de script. Comme indiqué dans mon mail je souhaite savoir si c'est possible d'afficher en temps réel la vitesse de l'upload en kbit/s Mbit/s ...

    Merci
    Kevin

  14. #134
    Expert éminent sénior

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

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut Comment faire afficher la vitesse d'upload
    Bonjour,

    Merci pour cette question

    La classe ne propose pas nativement cette information mais on peut la créer avec les fonctions javascript événementielles qui servent précisément à personnaliser le script selon ses besoins. Cela me donne l'occasion de montrer un exemple d'utilisation de la fonction javascript événementielle config.func_FileInProgressEach qui est tout indiquée dans ce cas.

    Voici donc un exemple basé sur le code du fichier UploadAjaxABCI_Basique.php fourni dans le dossier en téléchargement :

    Je rajoute un élément html ayant une classe vt pour afficher la vitesse de transfert à l'intérieur du bloc d'information spécifique à chaque fichier défini avec la classe "UpAbci_infosFile" :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <div class="UpAbci_infosFile" style="display:none;margin-top:1em;" data-upabcicss-select-file="display:block;">
                <span class="UpAbci_imgPreview"></span><!-- vignette de prévisualisation (si le fichier est une image) -->
                <span class="UpAbci_name"></span><!-- nom du fichier -->
                <progress class="UpAbci_progressionG"></progress> <!-- progression graphique --> 
                <span class="UpAbci_status" data-upabcicss-result-ok="color:green;font-weight:bold">en attente</span><!-- pour informer du statut "en cours", "ok", "erreur" ou "arrêt" en fonction de l'état du téléchargement. La mention "en attente" est écrite par défaut et sera remplacée par l'information adéquate durant le téléchargement du fichier. -->
                <span class="vt"></span><!-- vitesse de transfert -->
     
                <span class="UpAbci_stop" style="color:red;cursor:pointer;float:right" data-upabcicss-result="display:none">stop</span>
             </div>

    Côté javascript (en bas de page) j'utilise donc la fonction javascript événementielle config.func_FileInProgressEach qui est appelée lors de la progression des fichiers (à une fréquence définie par l'option de configuration javascript "config.infosRefresh" soit actuellement chaque seconde). J'utilise le paramètre obj de la fonction pour récupérer les informations nécessaires et faire afficher la vitesse de l'upload.

    Avant cela j'ai créé une fonction BitFormate qui permet de formater le résultat en Kb/s, Mb/s, Gb/s ...

    Le reste est documenté dans le code :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    <script>
    "use strict"; // Vous pouvez supprimer cette ligne en cas d'utilisation d'autres scripts javascript qui ne supportent pas ce mode.
     
    var destination_ajax = 'Php_Upload/UploadAjaxABCI_Php_Load_Basique.php'; 
     
    var up = new UploadAjaxABCI('#form_base',destination_ajax,'#reponse_upload');
     
    var BitFormate = function (Bits)
    {
            var Type = ["", "K", "M", "G", "T", "P", "E", "Z", "Y"];
            var Index = 0;
            while(Bits >= 1000)
            {
                    Bits /= 1000;
                    Index++;
            }
            // J'arrondi à 1 chiffre après la virgule pour '', 'K' et 'M', et 3 chiffres après la virgule pour les unités supérieures 
            Bits = Type[Index] == 'M' || Type[Index] == 'K' || Type[Index] == '' ?  Bits.toFixed(1) : Bits.toFixed(3);
            var unite = 'b/s';
            return(Bits+''+Type[Index]+''+unite);
    }
     
    up.config.func_FileInProgressEach = function(obj)
    {       
             // Utilisez console.log(obj) pour visualiser les propriétés de l'objet dans la console javascript
     
             // La propriété "qte_upload" inclut initialement la quantité sauvegardée "qte_save_ini" en cas de reprise d'upload si on a précédemment stoppé l'upload du fichier en cours. Je retire donc cette valeur et je multiplie le résultat (qui est en octet) par huit pour avoir des bits qui sont l'unité de transfert des données.
            var bit_upload = (obj.qte_upload - obj.qte_save_ini) * 8;
            
            // la propriété "time_end" est déjà formatée en secondes, par contre "time_start" est en millisecondes.
            var time_upload = obj.time_end - obj.time_start/1000;
            
            // Cela ne devrait pas arriver mais je vérifie par sécurité que time_upload soit supérieur à 0 pour éventuellement éviter une vilaine division par 0. 
            if(typeof time_upload === "number" && time_upload > 0)
            {
                    // La propriété "infos_html" de l'objet passé en paramètre à la fonction événementielle correspond à l'objet html ayant la classe "UpAbci_infosFile". Je fais afficher la vitesse formatée dans l'élément ayant la classe "vt"
                    obj.infos_html.find(".vt").html(BitFormate(bit_upload/time_upload));
            }
    }
     
    $(function(){up.Start()});
    </script>

    A noter que la vitesse instantanée au démarrage est toujours surévaluée par rapport au débit normal. Le débit affiché va donc logiquement s'effondrer durant les premières secondes ce qui pourrait éventuellement perturber des utilisateurs non avertis, même si c'est normal.

    Pour avoir un débit plus représentatif dès le premier affichage on peut différer l'affichage de cette information en utilisant le style événementiel data-upabcicss-remaning-time-compute (qui est appliqué après le délai défini avec l'option de configuration javascript "config.remainingTimeCompute" par défaut égal à 10 secondes). Par exemple :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <span class="vt" style="display:none" data-upabcicss-remaning-time-compute="display:inline"></span><!-- vitesse de transfert -->
    La vitesse de transfert sera ainsi plus représentative dès le premier affichage puisqu'elle ne s'affichera qu'après un délai de 10 secondes. Le seul inconvénient de cette option, si c'en est un, c'est qu'elle ne s'affichera pas pour les fichiers mettant moins de 10 secondes pour être téléchargés.

    Voilà

  15. #135
    Expert éminent sénior

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

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Version 6.4 disponible

    1/ Petite modification du code de la classe php UploadAjaxABCIServeur :
    Un problème de partage de fichiers pouvait survenir lors de l'intégration de ce module d'upload dans le framework cakePHP sur un serveur de test en local avec WAMP qui renvoyait une erreur: Le processus ne peut pas accéder au fichier car ce fichier est utilisé par un autre processus uniquement lors du chargement de petits fichiers, alors que l'upload de gros fichiers ne posait pas de problème.

    Néanmoins (toujours avec cakePHP), ce problème ne survenait pas sur un serveur distant php7 en production, tous les fichiers étaient correctement uploadés quelque soit leur taille.

    C'est corrigé. Peut éventuellement être bénéfique pour l'intégration de cet outil d'upload dans d'autres framework si vous rencontrez un problème similaire.

    2/ Pas de modification du code javascript.

    3/ Correction/amélioration de quelques commentaires dans les fichiers et surtout dans le mode d'emploi. Aussi, le mode d'emploi intègre maintenant le tuto en ligne, ainsi vous disposez de toute la documentation disponible même hors ligne.

    Voilà

  16. #136
    Expert éminent sénior

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

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

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

    Petit bug avec php 7.1.6 donc probablement avec les versions php 7.1+ (le code était ok pour php 7.0+).

    Il faut modifier légèrement la fonction returnOctets qui se trouve dans le fichier Php_Upload/Classes/UploadABCIServices.php

    Voici le code corrigé :

    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
    public function returnOctets($val)
    { // Retourne des octets depuis une chaine formatée comme 25ko ou 100 Mo ou 1 g
    	$val = str_replace([',',' '],['.',''],$val);
    	$val = rtrim($val, "oO");
     
    	$last = strtolower(substr($val,-1));
     
    	$val = floatval($val);
     
    	switch($last)
    	{
    		case 't':  $val *= 1024;
    		case 'g':  $val *= 1024;
    		case 'm': $val *= 1024;
    		case 'k':  $val *= 1024;
    	}
    	return $val;
    }

    Php devient maintenant parfois un peu susceptible avec les variables non typées...

    Je proposerai une nouvelle version avec cette correction quand j'aurai eu le temps de tester plus en profondeur tous les scripts proposés dans le module.

    En attendant je n'ai trouvé que cette erreur après avoir installé ce module d'upload pour un site qui utilise php 7.1.6 avec les fonctionnalités d'upload, de redimensionnement d'images et de vérification des fichiers déjà existants avant upload.

  17. #137
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2010
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 75
    Points : 60
    Points
    60
    Par défaut Récupérer les nouveaux noms
    Bonjour et merci pour ce très beau travail.

    Je ne suis pas expert et j’aurais besoin de votre aide pour finaliser mon formulaire car j’ai du mal à récupérer les retours d’ajax.

    Je voudrais enregistrer dans ma base de données un objet avec nom, type, … une source (image ou vidéo) et une vignette (image).

    J’utilise le formulaire de base UploadAjaxABCI.php et UploadAjaxABCI_Php_Load.php coté serveur qui propose déjà 2 upload. J’ai supprimé l’attribut multiple="multiple" car je ne veux qu’un fichier pour chaque upload

    Mon formulaire fonctionne, j’enregistre bien chaque fichier dans le dossier que je veux, dans le fichier UploadAjaxABCI_Php_Load.php j’arrive bien à récupérer mes champs supplémentaires, mais je ne sais pas comment récupérer les nouveaux noms donnés à mes 2 upload ni comment différencier celui de la source et de la vignette pour, une fois que les fichiers ont bien été uploadé, pouvoir créer mon objet et l’enregistrer dans ma base.

    Merci pour votre aide.

  18. #138
    Expert éminent sénior

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

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut Upload de plusieurs fichiers en ajax et enregistrement unique en bdd
    Salut,

    On peut différencier les fichiers côté serveur avec la méthode getParam('input_name') qui renvoie le nom de l'input.

    Dans ton cas, sur le principe tu as intérêt de stocker les informations sur les fichiers dans une variable de session pour faire l'enregistrement à la fin de l'upload des différents fichiers puisque tu ne fais qu'un enregistrement en bdd. De plus mieux vaut ne pas déplacer les fichiers uploadés directement dans leur emplacement définitif mais uniquement en fin de traitement, sinon tu risque d'avoir des fichiers orphelins dans tes répertoires si le visiteur a un problème sur un des fichiers ou abandonne l'upload en cour de traitement.

    Donc côté php on utilisera pas la fonction Transfert() mais on fera le transfert avec la fonction rename de php. De plus on utilisera la fonction saveAll() pour que tous les fichiers soient déplacés dans le répertoire temporaire du module d'upload et non pas dans le répertoire temporaire du serveur car dans ce cas ils seraient effacés à la fin de chaque requête ajax et donc impossible à récupérer par la suite.

    Côté javascript on utilisera l'option de configuration config.queryFormEnd = true qui envoie une requête au serveur à la fin du traitement de tous les fichiers. Et c'est à cette occasion qu'on fera les manipulations de transfert des fichiers côté php ainsi que l'enregistrement en bdd.

    Je donne ci-dessous un exemple de formulaire avec trois champs, un champ texte pour indiquer le titre et deux champs d'upload de fichiers. J'ai fait un contrôle javascript des champs par la même occasion et inséré le nom de l'input devant le nom du fichier sélectionné.

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    <?php
    session_start();
    header('Content-type: text/html; charset=UTF-8'); // Inutile depuis php 5.6
     
    require 'Php_Upload/Classes/UploadABCIServices.php';
    $up = new UploadABCIServices();
     
    // J'ai passé $UpAbci_fragmentSize à 25M car des petites valeurs ralentissent l'upload des très gros fichiers avec de nombreuses requêtes (donc la sauvegarde temporaire se fera tous les 25Mo). Si le serveur ne supporte pas cette valeur, on corrige avec les lignes suivantes.
    $UpAbci_fragmentSize = $up->returnOctets('25M');
     
    // Vérifie si $UpAbci_fragmentSize n'est pas supérieur aux limites du serveur
    $upload_max_filesize = $up->returnOctets(min(ini_get('upload_max_filesize'),ini_get('post_max_size')));
    $UpAbci_fragmentSize = !empty($UpAbci_fragmentSize) && $upload_max_filesize > $UpAbci_fragmentSize ? $UpAbci_fragmentSize : $upload_max_filesize;
     
    $UpAbci_uniqidForm = $up->getUniqid();
     
    // Jeton de formulaire
    $_SESSION['UploadAjaxABCI'][$UpAbci_uniqidForm]['token'] = 1;
    ?>
    <!DOCTYPE html>
    <html lang="fr">
    <head>
    <meta charset="UTF-8" />
    <meta name=viewport content="width=device-width, initial-scale=1">
    <title>Progressif Upload Ajax ABCIWEB</title>
    <link rel="icon" type="image/png" href="Javascript/Images/favicon.png" />
     
    <style type="text/css">
    html {
            font-family:"Trebuchet MS", Arial, Helvetica, sans-serif;
            font-size:0.9em;
    }
     
    .formajaxabci input[type=submit] {
            width:100px;
            font-size:1.2em;
    }
     
    .formajaxabci p, .reponse_form p {
            margin:0;
            padding:0;
    }
     
    .UpAbci_infosFile {
            word-wrap:break-word;   
    }
     
    .UpAbci_infosFile progress { 
            width:100px;
    }
    </style>
    </head>
     
    <body>
    <form class="formajaxabci" id="form_files1" action="#" method="post"> 
     <fieldset style="color:#900;border:2px solid #900;border-radius:5px;padding:1em">
        <legend>limité aux extensions avi, divx, mp4, mkv, mpg, jpg, jpeg, png, gif pour la Source et jpg, jpeg, png, gif pour la Vignette</legend>
         <input type="file" name="source" style="display:none" />
         <input type="file" name="vignette" style="display:none" />
     
         <input type="hidden" value="<?=$UpAbci_uniqidForm?>" name="UpAbci_uniqidForm" />
         <input type="hidden" value="<?=$UpAbci_fragmentSize?>" name="UpAbci_fragmentSize" />
     
         <input type = "text" name="titre" placeholder="Titre">
     
    	<!-- les boutons personnalisés ci-dessous remplaceront les boutons d'upload standards des champs de type file grâce à l'option de configuration "config.customFileSelect" déclarée en javascript plus bas  -->
         <input type = "button" value='Charger la source' class="bouton_fichiers" style="background-color:#FC0;border-radius:7px;height:2.5em;font-size:1.2em;cursor:pointer"  />
         <input type = "button" value='Charger la vignette' class="bouton_fichiers" style="background-color:#FC0;border-radius:7px;height:2.5em;font-size:1.2em;cursor:pointer" />
     
         <input type="submit" value="Envoyer" style="color:#900;height:2.5em;border-radius:7px;cursor:pointer" />
     </fieldset>
    </form>
     
     
    <!-- bloc conteneur des informations -->
    <div class="reponse_form" id="reponse_upload1" style="display:none;border-bottom:2px solid #900;padding:1em;" data-upabcicss-select-file="display:block" data-upabcicss-submit="display:block">
     
        <!-- retour d'informations générales du formulaire alimenté par les contrôles javascript et par le retour ajax. -->
        <div class="UpAbci_infosServer" style="display:none;color:#900;font-size:large;margin-bottom:1em;margin-top:0.5em"  data-upabcicss-infos-server="display:block"></div>
     
    	<!-- bloc conteneur d'informations d'un fichier (sera dupliqué par la classe si upload multiple). -->
        <div class="UpAbci_infosFile" style="margin-top:10px;display:none" data-upabcicss-select-file="display:block">
     
         	<!-- lien arrêt, affiché en transparence 0.5 si résultat (= upload terminé) Si tous les fichiers sont indispensables il ne sert à rien de proposer un arrêt individuel -->
    		<!-- <span style="cursor:pointer;color:#900" class="UpAbci_stop" data-upabcicss-result="cursor:default;opacity:0.5">arrêt</span> -->
     
             <!-- nom du fichier -->
    		  <span class="UpAbci_name"></span>
     
             <!-- taille du fichier -->
            <span class="UpAbci_size">0 Mo</span>
     
             <!-- progression graphique -->
            <progress class="UpAbci_progressionG"></progress>
     
             <!-- progression textuelle -->
         	&nbsp;en cours : <span class="UpAbci_progressionT">0 Mo</span>
     
             <!-- sauvegarde effectuée -->
           - sauvegardé : <span class="UpAbci_backup">0 Mo</span>
     
           	 <!-- temps passé -->
           - temps passé : <span class="UpAbci_duration">0 s</span>
     
           	 <!-- temps restant estimé -->
           - temps restant : <span class="UpAbci_remainingTime">indéfini</span>
     
             <!-- status (en attente, ok, erreur, arrêt)
             Si le visiteur sélectionne un fichier comportant des erreurs (data-upabcicss-error-user) - dans notre cas la vérification ne concerne que l'extension du fichier - on affiche en rouge. 
              A la fin de l'upload du fichier (data-upabcicss-result) ou si le fichier est arrêté volontairement, le status s'affichera en rouge, excepté si le status est ok (data-upabcicss-result-ok) auquel cas il s'affichera en vert -->
           - status : <span class="UpAbci_status"  data-upabcicss-error-user="color:red;font-weight:bold" data-upabcicss-result="color:red;font-weight:bold" data-upabcicss-result-ok="color:#090;font-weight:bold">en attente</span>
        </div>
     
        <!-- on affiche le lien "arrêter tout" uniquement si des fichiers ont été sélectionnés et on l'efface à la fin du traitement du formulaire --> 
     	<div class="UpAbci_stopAll" style="display:none;width:100px;margin:auto;font-size:0.9em;color:#900;cursor:pointer" data-upabcicss-select-file="display:block;margin-top:15px;" data-upabcicss-form-end="display:none">
        Arrêter tout
        </div>
     
        <!-- on affiche cette ligne d'information si une sauvegarde est trouvée pour au moins un fichier à la fin du traitement (à noter qu'en cas de téléchargement complet d'un fichier il n'existe plus de sauvegarde)-->
    	<div style="margin-top:10px;display:none" data-upabcicss-backup-end="display:block">
        <span style="font-weight:bold">Note : </span>les fichiers partiellement sauvegardés peuvent être complétés pendant 24h suivant la dernière sauvegarde effectuée.
        </div>
    </div>
    </body>
     
    <script src="Javascript/jquery.js"></script>
    <script src="Javascript/UploadAjaxABCI.js"></script>
     
    <script>
    // Destination de la requête ajax d'upload
    var destination_ajax = 'Php_Upload/UploadAjaxABCI_Php_Load_test.php';
     
    // formulaire 1
    var reponse_upload = $('#reponse_upload1');
     
     
    var Up = new UploadAjaxABCI('#form_files1',destination_ajax, reponse_upload);
     
    Up.config.queryFormEnd = true; // Indispensable dans ce script puisque l'enregistrement en bdd se fera lors de la requête additionnelle qui indique que tous les fichiers ont été traités
     
    //Si vous souhaitez avoir un contrôle d'extensions différent sur chaque champ du formulaire, vous pouvez utiliser l'option ".config.filesExtensionsInput" qui prend comme index le nom de l'input de type file et comme valeur le tableau d'extensions autorisées, exemple :
    Up.config.filesExtensionsInput['source'] = ['avi','divx','mp4','mkv','mpg','jpg','jpeg','png','gif'];
    Up.config.filesExtensionsInput['vignette'] = ['jpg','jpeg','png','gif'];
     
     
    Up.config.customFileSelect = ".bouton_fichiers";
     
    Up.config.cssSubmitOn = "cursor:default;opacity:0.6"; // Durant le téléchargement des fichiers, applique ces styles sur le bouton d'envoi du formulaire.                                                                                                                                                                                                                                                                                                                                                                                 
    Up.config.cssFileSelectOn = "cursor:default;opacity:0.6"; // Durant le téléchargement des fichiers, applique ces styles sur les boutons de sélection des fichiers. 
     
    // Contrôle des erreurs dans les champs du formulaire 
    var erreurs = {};
    var input_files;
     
    // Contrôle javascript des champs du formulaire on submit
    Up.config.func_onFormSubmit = function(e,tab)
    {
            var UpAbci_infosServer = reponse_upload.find(".UpAbci_infosServer");
     
            erreurs = {};
     
            // Liste des input de type file indispensables.  Si d'autres champs de type file sont indispensables compléter cette liste en attribuant au nom de l'input la valeur false.
            input_files = {'source':false, 'vignette':false};
     
            var form = e.target;
     
            // Contrôle du champ titre
            if ($.trim($(form).find("input[name=titre]").val()) == '') {erreurs['titre'] = 'Le titre doit être rempli';}
     
            // Contrôle des champs input, met à true pour les fichiers renseignés
            $.each(tab, function(t,v)
            {
                    //console.log(v);
                    $.each(input_files, function(i)
                    {
                            if(v.fichier.upabciInputName == i && v.fichier.size > 0) {input_files[i] = true;}
                    })
            })
     
            // Enregistre les erreurs des champs de fichiers non renseignés 
            $.each(input_files, function(i,v)
            {
                    if(!v) {erreurs[i] = 'Le fichier '+i+' est indispensable';}
            })
     
            reponse_upload.css('display','block');
            UpAbci_infosServer.empty();
            UpAbci_infosServer.css('display','block');
     
            // Si pas d'erreurs on envoie un message de début de téléchargement et on soumet le formulaire avec func_SubmitForm() 
            if($.isEmptyObject(erreurs))
            {
                    UpAbci_infosServer.append($("<p>Chargement en cours...</p>"));
     
                    Up.func_SubmitForm();
            }
            else
            {
                    $.each(erreurs, function(i,m)
                    {
                            UpAbci_infosServer.append($("<p>"+m+"</p>"));
                    })
            }
    }
     
     
    // Supprime les message d'erreur si les champs indispensables sont renseignés à la sélection des fichiers et insère le nom de l'input avant le nom du fichier
    Up.config.func_FileSelectAll  = function(e, tab)
    {
            var UpAbci_infosServer = reponse_upload.find(".UpAbci_infosServer");
     
            var form = $(e.target).parents('form:first');
     
            if ($.trim($(form).find("input[name=titre]").val()) != '' && erreurs['titre'] != 'undefined')
            {
                    delete(erreurs['titre']);
            }
     
            var input_name;
            $.each(tab, function(i,v)
            {
                    input_name = v.fichier.upabciInputName;
                    if (erreurs[input_name] != 'undefined')
                    {
                            delete(erreurs[input_name]);
                    }
     
                    //console.log(v.obj);
                    // J'insère le nom de l'input avant le nom du fichier
                    $('<span style="text-transform:capitalize;font-size:1.1em;font-weight:bold">'+input_name+'&nbsp;:&nbsp;<span>').insertBefore(v.obj.name);
            })
     
            UpAbci_infosServer.empty();
            if(!($.isEmptyObject(erreurs)))
            {
                    UpAbci_infosServer.css('display','block');
                    $.each(erreurs, function(i,m)
                    {
                            UpAbci_infosServer.append($("<p>"+m+"</p>"));
                    })
            }
            else
            {
                    UpAbci_infosServer.css('display','none');
            }
    }
     
     
    // Démarrage de la fonction, DOM chargé
    $(function(){Up.Start()});
    </script> 
    </html>


    Le fichier ci-dessus appelle un script nommé 'UploadAjaxABCI_Php_Load_test.php' que j'ai mis dans le répertoire 'Php_Upload' comme l'indique la ligne var destination_ajax = 'Php_Upload/UploadAjaxABCI_Php_Load_test.php';Voici donc le contenu de ce fichier nommé 'UploadAjaxABCI_Php_Load_test.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
    <?php 
    // Vous devez vérifier l'existence de ces dossiers ou changer ces adresses 
    /*------------------------------------------------------*/
    $dossier_destination1 = '../Destination_Upload1/'; 
    $dossier_destination2 = '../Destination_Upload2/';
    /*------------------------------------------------------*/
     
    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 'Classes/' . $class . '.php';});
     
    $up = new UploadAjaxABCIServeur();
     
    //$up->setModeDebug (); // pour avoir le retour des bug php durant le développement
     
    // IMPORTANT DANS CE CAS DE FIGURE saveAll() permet de télécharger tous les fichiers dans le dossier temporaire du script d'upload (Upload_Temp) sinon les petits fichiers seraient téléchargés dans le dossier "temp" du serveur et effacés en fin de script et donc irrécupérables dans la dernière requête qui enregistre les données en bdd. 
    $up->saveAll();
     
    $uniqid_form = $up->getParam("uniqid_form");
    // Il est conseillé 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::setMess('UpAbVerifToken'));
     
     
    //J'utilise des variables de session sous la forme $_SESSION['UploadAjaxABCI'][$uniqidForm]['index'] pour préserver l'espace de nom. Et j'assigne ces valeurs par référence pour simplifier l'écriture. Attention l'index "token" est réservé.
    function &sesInit($uniqid_form, $index)
    {
    	$_SESSION['UploadAjaxABCI'][$uniqid_form][$index] = isset($_SESSION['UploadAjaxABCI'][$uniqid_form][$index]) ? $_SESSION['UploadAjaxABCI'][$uniqid_form][$index] : null;
     
    	return $_SESSION['UploadAjaxABCI'][$uniqid_form][$index];
    }
     
    // Initialisation d'une variable de session pour la source.
    $obj_source =& sesInit($uniqid_form, 'source');
     
    // Initialisation d'une variable de session pour la vignette.
    $obj_vignette =& sesInit($uniqid_form, 'vignette');
     
    // Initialisation d'une variable de session pour le titre.
    $obj_titre =& sesInit($uniqid_form, 'titre');
     
     
    // On récupère le titre à supposé qu'il soit dans un champ de type text avec name="titre"
    $titre = isset($_POST['titre']) && trim($_POST['titre']) != '' ? urldecode($_POST['titre']) : null;
    // Je défini la variable de session $ses_titre si le titre est défini
    $obj_titre = isset($titre) ? $titre : $obj_titre;
     
     
    // getFragment() retourne true si un fichier (ou un fragment de fichier) est joint au formulaire, sinon false
    $fichier_en_cours = $up->getFragment();
    if($fichier_en_cours)
    {
    	// getCleanFileName() retourne le nom du fichier nettoyé
    	$nom_fichier_nettoye = $up->getCleanFileName();
     
    	// getParam("input_name") retourne le nom du champ de type file
    	$nom_input = $up->getParam("input_name");
     
    	// On vérifie les extensions (très recommandé) avec la fonction "verifExtensions()".
    	// A supposé que la ressource soit dans un champ de type file nommé "source" et la vignette dans un champ de type file nommé "vignette"
    	$filesExtensions = [];
    	if($nom_input == 'source') 
    	{
    		$filesExtensions = ['avi','divx','mp4','mkv','mpg','jpg','jpeg','png','gif'];
    	}
    	else if($nom_input == 'vignette') 
    	{
    		$filesExtensions = ['jpg','jpeg','png','gif'];
    	}
     
    	$verif_extension = $up->verifExtensions($nom_fichier_nettoye,$filesExtensions);
     
    	// empty($filesExtensions) est important car si le tableau est vide aucun contrôle n'est fait
    	if(empty($filesExtensions) || $verif_extension == false) 
    	{
    		$up->exitStatusErreur(SetMessages::setMess('UpAbExtensionFichier'));
    	}
     
    	// Une fois le contrôle des extensions fait, on fait l'upload 
    	$up->Upload();
     
    	// Puis on enregistre les données d'upload des fichiers en sessions suivant le nom du champ de type file si le fichier est entièrement téléchargé
    	$fichier_complet = $up->getTempAdressFileComplete();
    	if($fichier_complet != false)
    	{
    		if($nom_input == "source")
    		{
    			$obj_source['adresse'] = $fichier_complet;// adresse dans le dossier temmporaire
    			$obj_source['destination'] = $dossier_destination1.$nom_fichier_nettoye;// adresse de destination pour la source
    			$obj_source['type'] = $up->getParam("type");// type renvoyé par javascript (pas sécurisé, préférez un contrôle du type en php sur $obj_source['adresse'])
    		}
    		else if($nom_input == "vignette") 
    		{
    			$obj_vignette['adresse'] = $fichier_complet;
    			$obj_vignette['destination'] = $dossier_destination2.$nom_fichier_nettoye;// adresse de destination pour la vignette
    			$obj_vignette['type'] = $up->getParam("type");// type renvoyé par javascript (pas sécurisé, préférez un contrôle du type en php sur $obj_vignette['adresse'])
    		}
     
    		// 0n utilise pas la fonction Tranfert() donc on fait l'équivalent de ce que fait cette fonction pour le retour ajax, cf mode d'emploi "Configuration serveur" chapitre "Upload sans Transfert"
    		$up->setTransfertOk();
    		$up->deleteCookieSave();
    	}
    }
     
     
    // Si config.queryFormEnd = true dans la configuration javascript du formulaire, une requête additionnelle est envoyée quand le formulaire est terminé (cf mode d'emploi "Configuration serveur" chapitre "Récupération des paramètres Ajax prédéfinis")
    if (count($up->UpAbci_formEnd) > 0) 
    {
    	if(isset($obj_source,$obj_vignette,$obj_titre)) // à supposé que tous ces champs soient indispensables
    	{
    		// renameIdenticName pour renommer les fichiers en cas de doublon sur le serveur
    		$obj_source['destination'] = $up->renameIdenticName($obj_source['destination']);
    		$obj_vignette['destination'] = $up->renameIdenticName($obj_vignette['destination']);
     
    		// Transfert des fichiers dans leur emplacement définitif
    		$transfert_source = rename($obj_source['adresse'],$obj_source['destination']);
    		$transfert_vignette = rename($obj_vignette['adresse'],$obj_vignette['destination']);
     
    		if($transfert_source && $transfert_vignette)
    		{
    			// ici on est dans la condition où toutes les conditions sont réunies et on peut faire l'enregistrement en bdd en utilisant $obj_source, $obj_vignette (en enlevant les index 'adresse' qui ne seront pas utiles) et $obj_titre 
     
    			//...
     
    			// On peut envoyer un message dans le retour général du formulaire avec addInfosServer
    			$up->addInfosServer('<span style="color:#090">"'.$obj_titre.'" a bien été enregistré !</span>');
    		}
    		else
    		{
    			// on pourrait détailler plus précisément en testant séparément $transfert_source et $transfert_vignette et même éventuellement $obj_titre
    			$up->addInfosServer('Echec de l\'enregistrement, problème dans le transfert des fichiers.');
    		}
    	}
    	else
    	{
    		$up->addInfosServer('Echec de l\'enregistrement, formulaire incomplet.');
    	}
     
    	// On efface les variables de session
    	unset($obj_source,$obj_vignette,$obj_titre);
    }
     
     
     
    // *INDISPENSABLE dans tous les cas : Envoi des informations nécessaires pour terminer le script javascript avec "exitReponseAjax()"
    $up->exitReponseAjax();
    ?>

    Voilà la base, cela fonctionne correctement chez moi.

    Prévoir une tâche automatique (ex : cron) pour nettoyer régulièrement le dossier temporaire "Upload_Temp" (upload abandonné en cours de traitement, panne internet, etc). C'est pas indispensable pour le fonctionnement du script mais à la longue ce dossier pourrait prendre beaucoup de place sur le serveur. Il suffira pour cela d'appeler la classe "Php_Upload/Classes/NettoyageTemp.php" spécialement conçue pour cet usage.

    Et voilà

  19. #139
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2010
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 75
    Points : 60
    Points
    60
    Par défaut
    Bonsoir et merci infiniment de votre aide très complète.
    Problem solved

  20. #140
    Membre actif

    Homme Profil pro
    Webmaster, Réalisateur Vidéo, Chef de projet Web documentaire
    Inscrit en
    Juillet 2006
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Webmaster, Réalisateur Vidéo, Chef de projet Web documentaire
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2006
    Messages : 404
    Points : 241
    Points
    241
    Par défaut
    merci pour ce super travail et ce super plug.
    J'ai une question je butte sur la récupération des infos exif pour les enregistrer dans une BDD.
    ou puis je faire ça?
    merci

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

Discussions similaires

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

Partager

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