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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 386
    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 386
    Points : 10 413
    Points
    10 413
    Par défaut Upload de gros fichiers par fragments (chunk)
    Bonjour,

    Je vous propose un nouvel élément à utiliser : Upload de gros fichiers par fragments (chunk), reprise d'upload, affichage des informations en temps réel et styles événementiels.

    Upload les fichiers par fragments compilés dans un fichier temporaire quand ils dépassent une valeur paramétrable. L'upload terminé, le fichier temporaire est renommé avec son nom initial (éventuellement corrigé) et déplacé vers son emplacement définitif.

    - Permet de surpasser les limitations serveur "upload_max_filesize" et "post_max_size".

    - Permet la reprise d'un téléchargement interrompu après une panne internet ou serveur, en utilisant la partie sauvegardée.

    - Supporte l'upload multiple et surpasse la configuration serveur "max_file_uploads" avec un système de file d'attente (queuing).

    - Retour d'informations en temps réel, personnalisable et très souple.

    a/ Huit informations*sont disponibles durant l'upload : nom, taille, progression graphique, progression textuelle, sauvegarde partielle effectuée, temps passé, temps restant estimé, status (en cours, ok, partiel, erreur).

    b/ Dispose de style événementiels qui s'appliquent en fonction des événements suivant*: formulaire envoyé, fichiers soumis, fichier en cours d'upload, sauvegarde partielle disponible, upload terminé, upload terminé ok, upload terminé partiel, upload terminé erreur.

    Dossier de test prêt à l'emploi. Le fichier d'exemple se nomme "UploadAjaxABCI.php". Ouvrez-le (sans modifier l'organisation du dossier) et ça devrait fonctionner !

    N'oubliez pas de consulter le mode d'emploi avant de poser des questions...

    ATTENTION*! Pour faire des tests sur un serveur local il est conseillé d'utiliser le paramètre ".config.ajax_delai" avec une valeur assez importante pour espacer l'envoi des requêtes (ce qui est déjà fait dans le fichier d'exemple). Je ne pourrai pas être tenu pour responsable si une sollicitation importante du système donne le coup de grâce d'un disque dur en cours d'agonie.


    L'encre est à peine sèche, je vous propose cette classe juste avant de prendre des vacances... j'espère que vous ne trouverez pas trop d'erreurs

  2. #2
    Expert éminent sénior

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

    La classe javascript est maintenant proposée en version 1.5.

    1/ Ajout des commandes :
    - arrêter
    - arrêter tout
    Ces commandes sont optimisées afin de pouvoir effectuer (éventuellement) une reprise d'upload ultérieure dans les meilleures conditions possibles.

    2/ Les styles événementiels suivants ont été ajoutés :
    - arrêter
    - sauvegarde existante pour au moins un fichier en fin de traitement
    - fin de traitement du formulaire

    3/ La classe récupère et envoie maintenant tous les champs du formulaire (uniquement les input de type file auparavant). Une option de configuration est disponible pour interdire l'envoi du formulaire en absence de fichiers.

    4/ Le script php a été légèrement modifié.

    Le fichier d'exemples est plus complet (reprend les commandes ci-dessus) et mieux documenté.
    Le mode d'emploi a été mis à jour

    Lien de téléchargement ici

  3. #3
    Expert éminent sénior

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

    La classe javascript est maintenant proposée en version 1.6

    - Ajout de l'information "pourcentage" (du téléchargement effectué).

    - Le style événementiel "fin de traitement du formulaire" peut être maintenant utilisé même si l'on souhaite ne pas envoyer le formulaire en absence de fichiers joints.

    - Correction d'un bug si l'on choisissait l'option d'afficher la boite de confirmation javascript pour la reprise d'un téléchargement.

    - Légère optimisation du code par ailleurs (et trois variables globales qui s'étaient insidieusement infiltrées ont été repérées et éliminées sans pitié).

    Tous les fichiers ont été mis à jour dont le mode d'emploi et le fichier d'exemples une nouvelle fois amélioré

    Téléchargement ici

  4. #4
    Expert éminent sénior

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

    Grosse mise à jour pour cette nouvelle version 1.7

    - Les fichiers sont désormais listés dès leur sélection avant d'être téléchargés.

    - Les noms des input de type file sont maintenant passés côté serveur ce qui permet des destinations différentes pour les fichiers dans le cas de formulaires contenant plusieurs champs de téléchargement.

    - Une classe php a été créée pour faciliter le téléchargement et le contrôle/renommage/destination/... des fichiers côté serveur.
    Des fonctions de bases sont disponibles comme la vérification des extensions, le renommage des fichiers en cas de doublon avec des fichiers du serveur ainsi que des fonctions pour renvoyer des messages vers les blocs d'informations du status des fichiers et vers le bloc d'information général du formulaire.

    Le script "UploadAjaxABCI_PhpLoad.php" est abondamment commenté pour donner des exemples.

    Tous les fichiers et le mode d'emploi ont été mis à jour


    Téléchargement ici

  5. #5
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 386
    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 386
    Points : 10 413
    Points
    10 413
    Par défaut
    Version 1.8

    - Correction d'un bug de la version 1.7 qui pouvait se produire dans certaines circonstances lors de l'arrêt volontaire du téléchargement d'un fichier (arrêtait le téléchargement du fichier mais aussi le script)

    - Modification du comportement de l'affichage du temps restant qui reprend désormais ses valeurs initiales en cas d'arrêt volontaire d'un téléchargement.

    Téléchargement ici

  6. #6
    Futur Membre du Club
    Femme Profil pro
    Développeur Web
    Inscrit en
    Août 2020
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Services de proximité

    Informations forums :
    Inscription : Août 2020
    Messages : 1
    Points : 5
    Points
    5
    Par défaut Thank You
    Merci

  7. #7
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 386
    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 386
    Points : 10 413
    Points
    10 413
    Par défaut
    Upload Ajax-Php, version 7.6
    Disponible ici


    Classes Php

    A/ Modifications

    1/ Modifications des paramètres d'initialisation de la classe UploadAjaxABCIServeur
    - Suppression du paramètre de configuration "$verif_filesize_sup2Go".
    Une nouvelle fonction interne à la classe permet de vérifier l'intégrité des fichiers quelque soit leur taille et la version de php.

    - Suppression des paramètres de configuration "$cookie_heures" et "$cookie_path"
    Ces paramètres ont été remplacés par le paramètre $cookie_options qui requière un tableau identique au tableau d'options de la fonction native "setcookie" de php, excepté pour la première option "expires" remplacée par l'option "duration" qui indique la durée de validité du cookie exprimée en secondes, et non pas sa date d'expiration. Cela permet de configurer toutes les options, y compris l'option "samesite" pour compatibilité avec les futures exigences de sécurité des navigateurs. Tous les index du tableau d'option doivent être renseignés.


    2/ Modification du trait ParamsDefautServeur
    Pour se conformer aux modifications mentionnées ci-dessus.

    3/ Modification de la classe NettoyageTemp
    Pour se conformer à la modification du paramétrage du cookie mentionnée ci-dessus.

    4/ Modification de la classe Messages
    Fusion des messages d'erreur ayant les index 'UpAbServerNomInvalide' et 'UpAbServerTailleInvalide' qui ont été remplacés par l'index 'UpAbServerErreurForm' => "Erreur dans la vérification de l'intégrité du formulaire d'upload". Notez que cet index ne sert qu'en cas d'erreur dans la construction du formulaire, donc uniquement en phase de test (ou tentative de piratage en production), sa personnalisation/traduction est donc inutile.


    B/ Corrections

    1/ Optimisation du message d'erreur en cas de sauvegarde non valide suite à une reprise d'upload
    Depuis la version 7.5, qui par défaut contrôle le type MIME des fichiers, le message renvoyé pour cette erreur était: "type de fichier non valide". Il a été remplacé par "Reprise d'upload impossible. La sauvegarde n'est pas valide. Recharger votre fichier.". Notez que c'est une correction marginale dans le sens où ce message avait peu de chance d'être renvoyé car il est rare qu'un utilisateur stoppe la soumission de son fichier en cours d'upload dans l'intention de la reprendre par la suite, et d'autre part, ces sauvegardes suite à l'arrêt volontaire ou à une panne internet sont très majoritairement valides (à plus de 90% en moyenne). Une note à ce sujet a été ajoutée dans le mode d'emploi, rubrique "Mise en production, notes".

    2/ Correction de la fonction renameIdenticName évoquée ici.


    C/ Ajout de fonctionnalité

    Une fonction setCookie a été ajoutée dans le trait UploadABCITraitServices qui permet de configurer toutes les options, y compris l'option "samesite" quelque soit la version de php. Attention ! le tableau d'options est cette fois-ci rigoureusement identique à la fonction native de php, contrairement au tableau d'options renseigné dans l'initialisation de la classe UploadAjaxABCIServeur et dans lequel le paramètre "expires" est remplacé par le paramètre "duration". Toutes les options du tableau doivent être renseignées.


    Classe Javascript

    A/ Modifications

    1/ Comportement par défaut de la correction de l'orientation des images de prévisualisation
    Lorsque l'affichage des vignettes de prévisualisation des photos était activé, la classe UploadAjaxABCI corrigeait automatiquement l'orientation des images en fonction de ses informations EXIF. Ce n'est plus nécessaire puisque les dernières versions des navigateurs font maintenant cette correction, et une double correction provoquait une mauvaise orientation. Ce problème était principalement observable avec des photos provenant d'anciens APN, car les nouveaux envoient maintenant la plupart du temps des images correctement orientées sans utilisation des informations EXIF.

    Pour pouvoir revenir à l'ancien comportement, une option config.ExifOrientationCorrection configurée par défaut sur false, a été intégrée dans la classe d'upload javascript. Cela permettrait de faire un test sur la version du navigateur (pour les pays en retard technologique par exemple) afin de configurer cette option suivant le navigateur utilisé.

    Notez que cela n'a qu'une incidence sur la présentation des vignettes, et non pas sur le résultat final de l'upload puisque le code serveur possède son propre mécanisme de correction d'orientation avec la classe CorrectionExifJpg qu'il convient d'utiliser pour compatibilité avec un maximum d'APN, notamment en cas de traitements d'images (optimisation pour le web, redimensionnement, recadrage) effectués dans certains exemples du module d'upload.

    2/ Fonction docCookies
    Cette fonction utilisée en interne, mais disponible pour une utilisation externe, supporte maintenant la configuration de l'option "samesite".

    3/ Modification du paramètre de configuration config.cookiePath
    Ce paramètre conserve la compatibilité avec les anciennes versions puisqu'il est toujours possible d'indiquer le path en fournissant une chaine de caractère. Mais il accepte maintenant alternativement un tableau pour paramétrer l'option "domain". Noter que la configuration du path et du domaine doit être identique à la configuration du cookie envoyé par Php. Si vous modifiez la configuration par défaut du cookie, il faut le faire en même temps pour les classes javascript et php. Les autres options (secure, httponly et samesite) ne sont pas nécessaires côté javascript car le script ne fait que lire le cookie, et le supprime parfois (rarement).


    Compatibilité

    Si vous avez utilisé les exemples fournis dans le dossier en téléchargement, vous pouvez mettre le code à jour sans modification depuis la version 7.0.

    Vérifiez votre script d'upload côté serveur si vous avez configuré l'initialisation de la classe avec plus de deux paramètres en ligne, ou si vous avez utilisé la configuration avec un tableau en renseignant les index "cookie_heures", "cookie_path" ou "verif_filesize_sup2Go" (dans ce cas cela ne provoquera pas de bug mais ces paramètres seront ignorés). Consultez la fonction getParamUploadAjaxABCIServeur du trait ParamsDefautServeur pour prendre exemple et rectifier la configuration de ces options. Adaptez également les autres valeurs indiquées dans ce trait si vous les aviez modifiées.

    Si vous avez personnalisé la traduction des messages contenus dans la classe messages en utilisant par exemple la méthode surchargeMessages, faites attention aux index 'UpAbServerNomInvalide' et 'UpAbServerTailleInvalide' qui n'existent plus.

    La classe javascript peut être mise à jour indépendamment et sans contrainte depuis la version 7.0.

    En résumer, la plupart du temps vous pourrez faire une mise à jour transparente. En cas de personnalisation des scripts, faire attention à l'initialisation de la classe d'upload dans votre script Php, et mettre éventuellement à jour le fichier ParamsDefautServeur.php. Et si vous avez utilisé la méthode surchargeMessages, vérifiez votre code de construction du tableau des messages puisque deux index ont été supprimés (mais c'est peu probable qu'ils ait été utilisés puisqu'il était indiqué dans la classe "Messages" que leur personnalisation/traduction était superflue).


    Mise à jour du mode d'emploi
    Effectuée.


    Voilà

  8. #8
    Expert éminent sénior

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

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

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

  9. #9
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 386
    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 386
    Points : 10 413
    Points
    10 413
    Par défaut Module d'Upload Ajax/Php prêt à l'emploi
    Upload Ajax-Php, version 7.6b
    disponible ici


    A/ Mise à jour du code php

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

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

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

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

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


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

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

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

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

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

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

    Voilà

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Louvain-la-Neuve
    Inscrit en
    Octobre 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Louvain-la-Neuve

    Informations forums :
    Inscription : Octobre 2014
    Messages : 6
    Points : 7
    Points
    7
    Par défaut Redimentionnement
    Bonjour,
    Tout d'abord barvo et merci pour ce magnifique travail! C'est vraiment bien pensé et fini...

    Je cherchait comment et où intégré ma fonction de redimensionnement... Car il me retourne une erreur...
    Fonction pour redimensionner:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    	function Redimensionner($fichier, $new_width, $new_height){
     
      	$file_src = $fichier; 
    	$file_dest =$fichier;
    	//$new_width = 1000;
    	//$new_height = 1000;
    	$proportional=true;
     
    		$file_src_infos=pathinfo($file_src);
     
    		$attr=getimagesize($file_src);
    		$fw=$attr[0]/$new_width;
    		$fh=$attr[1]/$new_height;
     
    		$ext=strtolower($file_src_infos['extension']);
    		if(($ext=="jpg" or $ext=="png" or $ext=="JPG" or $ext=="PNG") and  ($attr[0]>$new_width or $attr[1]>$new_height))
    		{
     
    		if($proportional)
    			$f=$fw>$fh?$fw:$fh;
    		else
    			$f=$fw>$fh?$fh:$fw;
     
    		$w=$attr[0]/$f;
    		$h=$attr[1]/$f;
     
    		if($ext=="jpg") $ext="jpeg";
     
    		$func="imagecreatefrom".$ext; $src  = $func($file_src);
     
    		$x=0; $y=0;
    		if($proportional) $dest = imagecreatetruecolor($w,$h);
    		else {
    			$dest = imagecreatetruecolor($new_width,$new_height);
    			$x=($new_width-$w)/2; $y=($new_height-$h)/2; }
     
    		imagealphablending($dest,false);
     		imagesavealpha($dest,true);
    		imagecopyresampled($dest,$src,$x,$y,0,0,$w,$h,$attr[0],$attr[1]);
     
    		$func="image".$ext;
    		$func($dest, $file_dest);
    		imagedestroy($dest);
    		exit(json_encode(array('resultat' => 'Image redimentionnée.')));
    		}
     
    	}
    Lieu où je l'ai placée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    	if(!$UpAbci_blob_slice) // s'il est d'un seul morceau
    	{
    		if(@move_uploaded_file($_FILES['UpAbci_fragment']['tmp_name'], $destination_fichier))
    		{
    		Redimensionner($UpAbci_fichier_nom_final,'1000', '1000');
    		exit(json_encode(array('resultat' => 'upload_ok')));// ne pas modifier -> commande ajax
    				// Si OK on redimentionne 1000x1000 max.
    		}
    		else
    		exit(json_encode(array('erreur' => 'Erreur de transfert du fichier téléchargé.')));
    	}
    	else
    	{
    		 // On ouvre ou on crée le fichier
    		$fichier_cible = @fopen($temp_adresse, 'a+');
    		if($fichier_cible === false) exit(json_encode(array('erreur' => 'Erreur d\'ouverture du fichier temporaire.')));
    		
    		// On ouvre le contenu téléchargé
    		$upload_file = @fopen($_FILES['UpAbci_fragment']['tmp_name'], 'rb');
    		if($upload_file === false) exit(json_encode(array('erreur' => 'Erreur d\'ouverture du contenu téléchargé.')));
    		
    		// On lit son contenu dans une variable
    		$upload_size = $_FILES['UpAbci_fragment']['size'];
    		$upload_content = @fread($upload_file, $upload_size);
    		if($upload_content === false) exit(json_encode(array('erreur' => 'Erreur de lecture du contenu téléchargé.')));
    		fclose($upload_file);
    		
    		// On l'écrit dans le fichier temporaire
    		if(@fwrite($fichier_cible, $upload_content) === false) exit(json_encode(array('erreur' => 'Erreur d\'écriture du contenu téléchargé.')));
    		unset($upload_content);
    		
    		fclose($fichier_cible);
    		
    		$new_file_size = $cook_save_size + $upload_size;
    				
    		setcookie($cookie_name,rawurlencode($temp_adresse.'|'.$new_file_size),$time_cook_save,$path_cook_save);
    
    		if (!$UpAbci_fichier_fin) exit(json_encode(array('resultat' => 'continu')));// ne pas modifier -> commande ajax
    	}
    
    
    	if ($UpAbci_fichier_fin && $UpAbci_blob_slice) 
    	{
    		// vérification de l'intégrité du fichier
    		if ($verif_filesize_sup2Go_Ok || $UpAbci_fichier_size < 2147483648)
    		{
    			$size_upload = @filesize($temp_adresse);
    			
    			if($size_upload != $UpAbci_fichier_size)
    			{
    				setcookie($cookie_name,"",time()-3600,$path_cook_save);
    				exit(json_encode(array('erreur' => 'Erreurs possibles : la sauvegarde utilisée a été enregistrée lors d\'un instant critique, ou vous avez téléchargé simultanément deux fichiers identiques.')));
    			}
    		}
    		
    		if(@rename($temp_adresse,$destination_fichier)) 
    		{
    			setcookie($cookie_name,"",time()-3600,$path_cook_save);
    		// Si OK on redimensionne 1000x1000 max.
    		Redimensionner($UpAbci_fichier_nom_final,1000, 1000);
    			exit(json_encode(array('resultat' => 'upload_ok')));// ne pas modifier -> commande ajax
    		
    
    		}
    Un tout grand merci
    JPaul

  11. #11
    Expert éminent sénior

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

    Attention dans ta fonction "Redimensionner" tu utilises exit(json_encode(array('resultat' => 'Image redimentionnée.'))); or l'index 'resultat' est réservé comme commande ajax. Si tu veux ajouter des informations dans la ligne de résultat du fichier inspires-toi de la fonction "addStatusOkAjax" (de la classe php) qui fait un merge de la réponse serveur utile à la requête ajax et de ton information personnalisée qui s'ajoutera au status ok du fichier.


    Quelques remarques :

    - Si c'est pour faire du redimensionnement d'images côté serveur j'ai fais cette autre classe d'upload et redimensionnement. Elle est simple à utiliser et toutes les fonctions de redimensionnement sont déjà faites avec de très nombreuses options. Elle n'autorise pas le dépassement de la configuration serveur "upload_max_filesize" mais c'est un moindre mal dans le sens où la plupart du temps cette valeur (64 Mo chez ovh mutualisé par exemple) est largement suffisante pour uploader des images sans avoir à les découper. Et en cas de dépassement quelconque la gestion des erreurs quasiment complète permet d'avertir clairement l'utilisateur du problème rencontré.
    C'est un peu pour cette raison que je n'ai pas encore proposé de module d'interaction entre les deux classes : quand il s'agit d'images et de redimensionnement côté serveur, la classe purement php suffit dans la plupart des cas et elle est prévue pour cela. La classe javascript de ce sujet quant à elle est surtout utile pour les plus gros fichiers mais bien entendu on peut en charger des plus petits...
    Une autre piste serait de faire le redimensionnement en javascript en utilisant les canvas html5 qui donnent une meilleure qualité que la bibliothèque GD de php. Mais le travail étant fait sur le navigateur du visiteur cela peut poser des problèmes de compatibilité surtout concernant la puissance de l'appareil utilisé.

    Enfin donc si c'est pour redimensionner des images en php regardes plutôt le lien vers cette classe dédiée

  12. #12
    Futur Membre du Club
    Homme Profil pro
    Louvain-la-Neuve
    Inscrit en
    Octobre 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Louvain-la-Neuve

    Informations forums :
    Inscription : Octobre 2014
    Messages : 6
    Points : 7
    Points
    7
    Par défaut Autre classe
    Re,
    J'avais déjà essayé ton autre classe consacrée à l'uplaod des images (très bien détaillée), mais j'aimais bien ta présentation de téléchargement des fichiers et j'essaye donc de combiner les 2.
    B à t
    JPAul

  13. #13
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2014
    Messages : 18
    Points : 8
    Points
    8
    Par défaut
    Merci bien chef pour cette mise à jour.
    Agréable soirée à toi!!

  14. #14
    Expert éminent sénior

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

    Nouvelle version 1.9 en ligne

    A/ Améliorations

    1/ La classe serveur php a été mise à jour :

    - Permet de modifier plus facilement les fichiers téléchargés complets avant leur déplacement vers leur emplacement définitif. Des exemples sont donnés avec notamment une fonction de renommage de fichier et une fonction de redimensionnement d'images.

    - Meilleur gestion des erreurs en cas de fichiers temporaires non valides ou corrompus.


    2/ La classe ajax a été mise à jour :

    - Le status "téléchargement partiel" (qui indiquait une sauvegarde disponible) a été supprimé car il pouvait prêter à confusion en étant prioritaire sur le status "erreur serveur". C'était initialement prévu pour pouvoir afficher le maximum d'informations avec un minimum d'éléments html, mais après de multiples tests ce n'était pas pertinent dans tous les cas (suivant le type d'erreur). Comme par ailleurs une classe spécifique ainsi que des styles événementiels sont réservés à l'affichage de la sauvegarde disponible, autant afficher les deux informations séparément. L'affichage est maintenant cohérent dans tous les cas.


    3/ Exemples de formulaires de téléchargement

    - Les exemples du fichier de test "UploadAjaxABCI.php" ont été complétés et la présentation est plus élaborée.



    B/ Corrections

    1/ Classe ajax toutes versions
    Le temps restant n'était pas correctement renseigné en cas d'utilisation de la boite de confirmation javascript de reprise d'upload si l'on choisissait de réinitialiser le téléchargement en cliquant sur "annuler".

    2/ Classe ajax versions 1.7 et 1.8
    Les boutons de sélection de fichiers effacent maintenant les fichiers précédemment sélectionnés sur le comportement "onclick", (uniquement sur "onchange" auparavant) ce qui permet de refaire exactement la même sélection après un arrêt de tous les fichiers sans avoir besoin d'envoyer le formulaire ou de rafraichir la page. Fonctionnait néanmoins correctement sous Firefox, mais pas sous Chrome et IE. Ce disfonctionnement a pu être corrigé sous Chrome mais pas sous IE10 qui ne permet pas de modifier (même simplement de réinitialiser) les champs de type file. Je n'ai pas fait de correctif pour ce navigateur (et ceux qui ont le même problème) car ce cas de figure est somme toute très marginal et il reste toujours la possibilité de rafraîchir la page.

    3/ Classe php serveur versions 1.7 et 1.8 IMPORTANT
    La sauvegarde partielle de fichiers avec des noms incluant des caractères spéciaux sur l'ordinateur du visiteur n'était pas possible. Dans ce cas, seul le téléchargement de fichiers inférieurs à la taille d'un fragment (8Mo par défaut) était possible.

    4/ Mode d'emploi versions 1.7 et 1.8
    La deuxième note du chapitre "ordre d'application des styles" du mode d'emploi était erronée.




    Tous les fichiers et le mode d'emploi ont été mis à jour
    Lien de téléchargement

  15. #15
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2014
    Messages : 18
    Points : 8
    Points
    8
    Par défaut
    Merci pour la mise à jour de ta classe.Je vais l'essayer et je te ferai le retour.Agréable journée à toi?
    Vraiment merci pour le travail que vous faites pour nous les novices.

  16. #16
    Expert éminent sénior

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

    Correction : concerne uniquement les éventuels champs supplémentaires de type "input" que vous pourriez ajouter dans le formulaire.

    Lors de la mise en ligne dans différents contextes je me suis aperçu que les champs input éventuellement rajoutés dans le formulaire - ne concerne pas les champs déjà présents nécessaires au téléchargement - n'étaient pas correctement encodés s'ils contenaient des caractères spéciaux.

    Explication : excès de zèle de ma part quand je passe ces champs dans le FormData en utilisant la méthode "encodeURIComponent". C'était oublier que je récupère préalablement ces champs avec la méthode "serialize" de jquery qui applique déjà cette fonction...
    => pour corriger cette erreur, dans le fichier "UploadAjaxABCI-DEV.js", faites une recherche sur {formData.append(tabv[0],encodeURIComponent(tabv[1]))} et remplacer par {formData.append(tabv[0],tabv[1])} (ligne 822).

    Je précise pour les débutants que pour avoir ensuite l'équivalent en fichier compressé (correspondant au fichier UploadAjaxABCI.js) il suffit d'utiliser un outil de ce genre, ou faire une recherche avec les termes "minify javascript online" dans un moteur de recherche.

    Je ferai prochainement une mise à jour de la fonction en ajoutant par la même occasion plus de fonctionnalités

  17. #17
    Futur Membre du Club
    Homme Profil pro
    Louvain-la-Neuve
    Inscrit en
    Octobre 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Louvain-la-Neuve

    Informations forums :
    Inscription : Octobre 2014
    Messages : 6
    Points : 7
    Points
    7
    Par défaut Redimentionnement
    J'ai réussi a intégrer le redimensionnement dans la partie où on a la possibilité d'envoyer vers msql. Ce qui fonctionne TB.
    Je n'ai pas encore trouvé comment changer le message. "Redimensionnement" mais ça fonctionne déjà TB.
    Encore bravo...
    Je vais pourvoir maintenant utiliser le v 1.9!
    Encore bravo pour ton travail! Tu n'arrêtes pas!
    JPAul

  18. #18
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 386
    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 386
    Points : 10 413
    Points
    10 413
    Par défaut
    Citation Envoyé par jpaulweb Voir le message
    Je vais pourvoir maintenant utiliser le v 1.9!
    Encore bravo pour ton travail! Tu n'arrêtes pas!
    Et bientôt la version 2.0 comprendra une option pour prévisualiser les fichiers (s'il s'agit de photos) avant le téléchargement

    En fait au départ je voulais faire cette classe pour le téléchargement de gros fichiers avec la possibilité de reprise d'upload. Et puis comme tu l'a dit plus haut, qui peut le plus peut le moins et on peut aussi utiliser cette classe dans tous les cas pour profiter du retour d'information en temps réel. Donc je continue le développement pour qu'elle soit généraliste et pouvoir l'utiliser "en remplacement" de ma première classe qui est uniquement en php (mais qui garde cependant son intérêt pour sa totale compatibilité avec les anciens navigateurs et son paramétrage beaucoup plus rapide qui peut convenir à de "grands débutants").
    Enfin bon je crois que j'arrive vers la fin du dev car après l'affichage des vignettes je vois ne vois plus trop de fonctionnalités à développer

  19. #19
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 386
    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 386
    Points : 10 413
    Points
    10 413
    Par défaut Classe d'upload Ajax + php version 2.0
    Bonjour,

    La version 2.0 est en ligne ici !


    1/ Nouvelles fonctionnalités :

    -Affichage possible des vignettes de prévisualisation (si les fichiers sont des images) avant l'upload.
    Pour contenir cette information la classe css "UpAbci_apercu_img" a été créée, ainsi que 4 paramètres de configuration javascript :
    - .config.max_weight_apercu = ...; // en Mo. Poids maximal de chaque image pour prévisualisation. Si cette valeur est dépassée pour au moins une image dans un upload multiple, aucune vignette ne sera affichée afin de préserver une cohérence dans l'affichage des informations
    - .config.total_max_weight_apercu = ...; // en Mo. Poids total maximal de toutes les images (en téléchargement multiple) pour prévisualisation. Si dépassé aucune vignette ne sera affichée
    - .config.max_width_apercu = ...; // en pixels. Largeur maximale de l'aperçu
    - .config.max_height_apercu = ...; // en pixels. Hauteur maximale de l'aperçu

    - Gestion de l'affichage du temps restant
    Nouveau style événementiel "data-upabcicss-temps-restant-requis" qui sera appliqué si le temps restant estimé pour l'upload du fichier est supérieur à la valeur du nouveau paramètre de configuration javascript ".config.temps_restant_requis".
    L'idée est de pouvoir supprimer l'affichage du temps restant pour les petits fichiers tout en le rendant disponible pour les gros sans avoir besoin de modifier la configuration du script

    - Tâche cron de nettoyage
    Un nouveau fichier php nommé "nettoyage_temp.php" donne un exemple de script pour nettoyer le dossier temporaire. Ce script devrait être appelé régulièrement pour nettoyer les fichiers abandonnés dans le dossier temporaire.


    2/ Corrige le dernier petit bug mentionné dans ce message.



    Tous les fichiers dont le mode d'emploi et le fichier d'exemples ont été mis à jour

  20. #20
    Membre actif

    Inscrit en
    Octobre 2010
    Messages
    168
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 168
    Points : 241
    Points
    241
    Par défaut
    Slt juste un mot pour ton travail ça à l'air pas mal.

    Bonne continuation.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 3 123 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