|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | |||||
|
Expert Confirmé
![]() ![]() Alain Inscription : septembre 2010 Messages : 1 916 ![]() |
Bonjour,
Cette classe d'upload et redimensionnement est conçue pour offrir de multiples possibilités pour une configuration minimale. Compatible php >= 5.1 Fonctions principales (options) : - Contrôle des extensions. - Renomme un fichier (mode incrémental ou suffixe unique) si un fichier de même nom se trouve sur le serveur. - Choix du nom du fichier de destination (compatible avec la fonctionnalité précédente). - Redimensionnement multiple (ou unique) en sauvegardant ou non l'image originale. - Gestion des erreurs. - Retour messages d'informations pour le visiteur (paramétrable). - Retour tableau de résultat pour enregistrement en bdd. Exemples : Pour télécharger des fichiers de types "pdf" ou "txt" dans un répertoire "Documents", si votre champ de formulaire de type file se nomme "doc" et une variable $_POST témoin d'envoi du formulaire se nomme "form1", il suffit d'écrire : Citation:
Code :
Citation:
Citation:
En complément, - Vous pouvez renommer automatiquement les fichiers en téléchargement s'il existe un fichier de nom identique dans le répertoire de destination, ou faire un simple contrôle anti écrasement. - Faire plusieurs redimensionnements par image et les enregistrer dans des répertoire différents, et sauvegarder ou non l'image originale. - Imposer un nom de fichier comme nom de destination. - Faire afficher les messages de résultats pour le visiteur. - Obtenir un tableau de résultat pour faciliter l'enregistrement des résultats dans une bdd. Etc. Code et mode d'emploi détaillé ici. Exemples d'utilisation dans les messages suivants.
__________________
- Réalisations - Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical. |
|||||
|
|
20
|
|
|
#2 | ||
|
Expert Confirmé
![]() ![]() Alain Inscription : septembre 2010 Messages : 1 916 ![]() |
Exemples complets d'utilisation.
Pour fonctionner sans modification cela suppose que vous ayez des répertoires PHOTO, PHOTO_GF, PHOTO_PF et PDF situés à la racine du site. Par ailleurs la classe doit être enregistrée dans un fichier nommé "Classe_Upload.php" situé dans le même répertoire que ce script ( puisque l'on fait en première ligne : require('Classe_Upload.php'); ) Rappel : Le répertoire de destination doit être indiqué par rapport à la racine www. Si vous testez en local avec plusieurs sites installés sur la racine du serveur d'évaluation (dans le répertoire www) vous devrez indiquer pour un chemin de répertoire valide : "nom_du_site/nom_du_repertoire" et pour un fonctionnement sur le serveur distant, simplement : "nom_du_repertoire" L'avantage de cette configuration est que vous pouvez appeler ce script depuis n'importe quel endroit de votre site sans avoir à modifier le chemin des répertoires de destination. Note : ne soyez pas impressionné par la longueur du code de l'exemple ci-dessous. D'une part cet exemple comprend plusieurs formulaires dans une même page et d'autre part le code est très documenté Vous trouverez dans un prochain message un exemple plus court qui permet par ailleurs de choisir un dossier de destination depuis le formulaire. Code :
__________________
- Réalisations - Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical. |
||
|
|
00
|
|
|
#3 | ||
|
Expert Confirmé
![]() ![]() Alain Inscription : septembre 2010 Messages : 1 916 ![]() |
Pour compléter mon second message, un autre exemple qui permet de choisir un dossier de destination depuis le formulaire, tout en permettant la gestion complète des erreurs, notamment le dépassement du post maximum autorisé par le serveur (post_max_size).
Code :
En effet si la valeur post_max_size autorisée par le serveur est dépassée, aucun $_POST ne sera retourné par le serveur. Si l'on conditionnait l'instanciation de la classe à l'envoi d'une variable $_POST elle ne pourrait donc pas fonctionner ni retourner l'erreur de dépassement. Autre remarque de cet exemple, par défaut on indique un nom de dossier valide ($dossier = $dossiers_autorise[0]; ) pour qu'au chargement de la page, en attente d'un dossier choisi, la classe trouve un nom de dossier valide et ne renvoi pas un message d'erreur de dossier de destination.
__________________
- Réalisations - Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical. |
||
|
|
00
|
|
|
#4 | ||
|
Expert Confirmé
![]() ![]() Alain Inscription : septembre 2010 Messages : 1 916 ![]() |
Bonjour,
La classe d'upload est compatible avec l'attribut html5 "multiple" qui permet de sélectionner plusieurs fichiers simultanément en maintenant la touche "Ctrl" enfoncée durant la sélection des fichiers. Le paramétrage de la classe est inchangé, tout se situe dans le code html où il suffit d'ajouter l'attribut multiple = "multiple" dans le champ de type file sans oublier de déclarer son nom sous forme d'un tableau (ici name = "photo[]"). Cependant cet attribut "multiple" n'est pas supporté par IE et d'autres navigateurs récents. De plus il ne permet que la sélection multiple de fichiers provenant d'un même répertoire. Une solution "universelle" est donc de proposer l'ajout supplémentaire de champs possédant l'attribut multiple avec une fonction javascript : Code :
Dans l'exemple complet ci-dessus, l'instanciation de la classe indique (en premier argument) le répertoire "PHOTO" comme nom de destination des fichiers. Remplacer ce nom par un nom de dossier valide sur votre site - chemin par rapport au dossier www - sans quoi vous obtiendrez un message d'erreur dès le chargement de la page.
__________________
- Réalisations - Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical. |
||
|
|
00
|
|
|
#5 |
|
Membre éclairé
![]() Webmaster Inscription : février 2007 Messages : 267 ![]() |
Hello,
Perso j'aurais fais 2 classes, une pour l'upload et l'autre juste pour les redimentionnements d'images. J'aurais aussi créé un repertoire automatiquement si non existant. J'aurais utilisé une expression régulière pour le cleanage du nom de fichier. Je trouve dommage qu'il n'y ait pas de crop d'images. |
|
|
00
|
|
|
#6 | ||
|
Expert Confirmé
![]() ![]() Alain Inscription : septembre 2010 Messages : 1 916 ![]() |
Citation:
Ta classe se destine plus à des développeurs qui trouveront des outils pour utiliser les fonctions qu'ils souhaitent suivant leurs besoins. Mais cela demande des connaissances sur le sujet, de se plonger dans les fonctions, et plus de travail de configuration. En contre partie il sera assez facile d'ajouter de nouvelles fonctionnalités. Ma classe est conçue comme un module prêt à l'emploi, facilement utilisable aussi bien par les néophytes que par les moins débutants. Comme je le dis en introduction, "elle est conçue pour offrir de multiples possibilités pour une configuration minimale". J'aurais dû ajouter, mais c'était sous entendu, "et des connaissances requises minimales". Il y a donc un travail de documentation et d'automatisation des options beaucoup plus important : configuration identique pour upload simple, ou multiple upload, ou encore upload multiple HTML5 (à partir d'un même champ), gestion complète et détaillée du téléchargement et des erreurs avec retour personnalisable, tableau de résultats avec dimensions pour enregistrement en bdd, nommage et renommage automatique des fichiers de destinations, redimensionnement simple ou multiple ou simple optimisation etc, le tout très facilement paramétrable. En contre partie, du fait des automatismes mis en place, il sera plus difficile d'ajouter des fonctionnalités non existantes. Cette classe ne sait pas tout faire mais elle répond à la plupart des besoins courants d'upload. Et pour les fonctionnalités existantes - toutes documentées - le paramétrage est des plus simple et la mise en place peut être effectué en un minimum de temps A vrai dire je n'y ai pas pensé. La création d'un répertoire relève d'une réflexion sur l'organisation et l'accès des données et ce n'est vraiment l'objet de cette classe. Et puis rien n'empêche d'ajouter les deux ou trois lignes avant l'instanciation de la classe qui permettront de créer si besoin un répertoire. Je donnerai peut être ultérieurement un exemple pour ceux que ça intéresse. Citation:
Oui ça c'est un manque d'intérêt de ma part pour le crop. Je ne vois pas l'intérêt de faire du recadrage à l'aveugle. Faut dire que j'ai un passé de photographe qui me rend très allergique à cette "idée". Pour moi le travail sur une image (correction des couleurs, luminosité, recadrage etc.) est une étape distincte de l'upload. J'ai bien vu quelques exemples sur le net qui permettent un contrôle du recadrage avant le chargement des images mais ils utilisent des modules externes à php... et comme au final l'intérêt est très relatif, je préfère laisser cette classe autonome pour l'ensemble de son fonctionnement.
__________________
- Réalisations - Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical. |
||
|
|
00
|
|
|
#7 | |
|
Membre régulier
![]() Inscription : mai 2007 Messages : 319 ![]() |
Bonjour,
Perso je dit chapeau, j'aime bien cette classe elle me permet de faire ce que je souhaite en un minimum de code. C'est très bien pour l'ajout d'avatar a un profil, ou une galerie photos. J'aurais juste une question : Comment redimensionner une même image dans 2 formats différents en les préfixant d'une certaine manière ? j'ai fait ça mais seul la miniature est généré : Citation:
Notice: Undefined index: channels in /xxx/xxx/www/xxx/upload.class.php on line 779 soit la ligne : return array($infos[0], $infos[1], $infos[2], $infos['bits'], $infos['channels']); Une idée ? |
|
|
|
00
|
|
|
#8 |
|
Membre régulier
![]() Inscription : mai 2007 Messages : 319 ![]() |
Heuuu question :
Comment faire pour récupérer le nom de l'image créé. En effet j'ai besoin d'enregistrer en base le nom de l'image, mais j'ai n'arrive pas a le récupérer. D'avance merci |
|
|
00
|
|
|
#9 |
|
Expert Confirmé
![]() ![]() Alain Inscription : septembre 2010 Messages : 1 916 ![]() |
Pour ta première question il n'est pas prévu de nommer deux redimensionnements avec des noms différents. Mon idée était de donner le même nom pour les différents redimensionnements afin de préserver la concordance des données et de télécharger les fichiers résultants dans des répertoires différents. Donc sauf à modifier la classe, ce n'est pas possible. Cela dit l'organisation avec des répertoires différents apporte de nombreux avantages...
Pour la notice, bizarre que "channels" ne soit pas retourné mais après rapide vérification je ne crois pas que je m'en sert (pas plus que de $infos['bits'] d'ailleurs) donc si cela n'empêche pas le script de fonctionner, tu peux ignorer. Ou sinon tu peux essayer de le supprimer ce qui donnera la ligne 779 (dans ton exemple) : Code :
return array($infos[0], $infos[1], $infos[2], $infos['bits']); Code :
return array($infos[0], $infos[1], $infos[2]); Pour ta dernière question, pour récupérer le nom de l'image créée tu peux te servir de Get_Tab_upload () en exemple dans mon second message.
__________________
- Réalisations - Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical. |
|
|
00
|
|
|
#10 |
|
Expert Confirmé
![]() ![]() Alain Inscription : septembre 2010 Messages : 1 916 ![]() |
Bonjour,
La classe a été mise à jour (nouvelle version 2.2) : - évite la notice (décrite dans le message ci-dessus) qui pouvait s'afficher en local lors de redimensionnements de fichiers autres que jpg/jpeg. - optimisation de la fonction de renommage de fichiers en mode incrémentiel. Lien de téléchargement ici
__________________
- Réalisations - Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical. |
|
|
00
|
|
|
#11 |
|
Invité de passage
![]() Ange Electricien Inscription : avril 2010 Messages : 2 ![]() |
Bonjour à tous.
Je voulais juste dire merci pour cette classe, car c'est exactement ce que je cherchais à faire et ça m'aurais pris des années, voir des siècles.... ![]() Bravo au concepteur et encore merci de nous le faire partager ![]() Bonnes fêtes à tous Bye |
|
|
00
|
|
|
#12 | |
|
Expert Confirmé
![]() ![]() Alain Inscription : septembre 2010 Messages : 1 916 ![]() |
Citation:
Je rajouterai dans un prochain message un exemple avec une barre de progression du téléchargement et affichage du temps restant
__________________
- Réalisations - Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical. |
|
|
|
00
|
|
|
#13 | ||||
|
Expert Confirmé
![]() ![]() Alain Inscription : septembre 2010 Messages : 1 916 ![]() |
Bonjour,
php 5.4 nous offre désormais la possibilité d'avoir des informations sur la progression d'un upload via une variable de session. En faisant une requête ajax il est donc possible d'afficher des informations textuelles et/ou une barre de progression pour indiquer l'avancement de l'upload. Dans le script ci-dessous, je reprend mon dernier exemple en y ajoutant une barre de progression et l'information du temps restant. Vous remarquerez que le code php reste identique. Le code javascript a été complété pour faire les requêtes ajax et le code html pour inclure l'input d'identification de la variable de session et le div d'affichage de la progression. Des liens vers des fichiers javascript ont également été ajoutés comme indiqué ci-dessous : J'utilise jquery par simplification car il peut nous fournir une barre de progression prête à l'emploi. En plus de jquery vous devrez donc télécharger les fichiers "jquery.ui.core.min.js", "jquery.ui.widget.min.js", "jquery.ui.progressbar.min.js", et "jquery-ui-1.8.23.custom.css" (ou équivalent suivant la version). Vous trouverez ces fichiers en allant sur http://jqueryui.com/download puis cliquez pour commencer sur "Deselect all components" (ou sur "Toggle All") , puis sélectionnez simplement "Progressbar" puis faites le download. Ces fichiers se trouvent quelque part dans le dossier que vous aurez décompressé. Dans mon exemple j'ai mis ces fichiers dans un dossier nommé "Script" pour les fichiers javascript, et "librairie" pour le dossier "ui-lightness" (qui contient des fichiers css et des images). Si vous voulez une barre de progression animée regardez mon commentaire dans le code css du script. Code :
Code :
Complément pratique : la requête ajax permet par la même occasion de savoir si la directive "post_max_size" est dépassé ou non. Vous n'aurez donc à attendre que quelques secondes avant le reload de la page et l'affichage du message d'avertissement Par contre en cas de dépassement du "max_file_size" cela reste comme avant (faut attendre) car il serait impossible de choisir depuis php quel fichier doit être interrompu, en effet la variable de session $_SESSION[$key]["cancel_upload"] annule également tous les fichiers en attente. Mais le dépassement du "max_file_size" ne pose généralement pas de problème car la plupart du temps les serveurs sont configurés avec une valeur de "max_file_size" égale à la valeur de "post_max_size". Attention avec les navigateurs Chrome et Safari : ces navigateurs sont pour l'instant buggués et ne permettent pas de faire des requêtes ajax en même temps qu'un upload. Cela ne bloque pas l'upload mais vous ne verrez donc que le message "Patientez" durant le chargement. Cela dit Chrome possède une fonction intégrée sur la progression de l'upload qui s'affiche à gauche en bas de la page, c'est donc un moindre mal. Debug : - Si le message "patientez" ne s'affiche pas c'est que vous n'avez pas installé jquery - Si (pour un upload de plusieurs secondes) le message "patientez" n'est pas remplacé par un message de progression d'upload c'est que vous n'avez pas php 5.4 mais une version inférieure (ou un navigateur buggué cf paragraphe ci-dessus). - Si (pour un upload de plusieurs secondes) seul un message de progression d'upload s'affiche en remplacement du message "patientez", mais sans la barre de progression, c'est que vous n'avez pas correctement configuré le chemin des fichiers jquery nécessaires à l'affichage de la barre de progression. Note : Oui on pourrait aussi attendre que tous les navigateurs supportent correctement les nouvelles fonctionnalités d'upload html5. L'avantage de cette solution est qu' hormis les deux navigateurs buggés cités ci-dessus, l'affichage de la progression fonctionne avec tous les navigateurs mêmes très anciens comme IE 6... Télécharger la dernière version de la classe d'upload ici
__________________
- Réalisations - Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical. |
||||
|
|
00
|
Copyright © 2000-2013 - www.developpez.com