Upload de fichiers vérification renommage redimensionnements

ViPHP
AB
ViPHP | 5818 Messages

25 oct. 2012, 01:57

Bonjour,

Une notice peut être renvoyée par la classe d'upload lors de redimensionnements de fichiers autres que jpg/jpeg.

Ce n'est pas dérangeant lors de l'utilisation sur un serveur distant (car ils sont configurés pour ne pas renvoyer les notices), cependant pour éviter cette notice lors de tests en local vous pouvez remplacer dans le code de la classe d'upload, la ligne :
return array($infos[0], $infos[1], $infos[2], $infos['bits'], $infos['channels']);
par la ligne
return array($infos[0], $infos[1], $infos[2]);
Il n'y aura aucune incidence sur le fonctionnement puisqu'en fait la classe n'utilise ni $infos['bits'] ni $infos['channels'].

Mammouth du PHP | 19639 Messages

27 oct. 2012, 13:15

Salut AB,
par curiosité, j'ai regardé un peu : pour le problème que tu as soulevé sur la notice, il y aurait une manière plus simple et à mon avis plus élégante de le résoudre.

Personnellement, j'aurais donc ré-écrit la méthode de la manière suivante :
    private function Infos_image($fich)
    {
        $retour = false;
        $types_accepte = array(1, 2, 3);
        $infos = (file_exists($fich) && false !== exif_imagetype($fich)) ? getimagesize($fich) : false;
        if(false !== $infos && !empty($infos[0]) && !empty($infos[1]) && !empty($infos[2]) && in_array($infos[2], $types_accepte))
        {
            $retour = array($infos[0], $infos[1], $infos[2]);
            if(isset($infos['bits']))
            {
                $retour[] = $infos['bits'];
                if(isset($infos['channels']))
                {
                    $retour[] = $infos['channels'];
                }
            }
        }
        return $retour;
    }
L'idée, c'est que si l'utilisateur qui n'a pas eu de problème et utilise déjà les informations sur les bits et les channels, il ne perdra pas ces informations, pas de régression donc, et en ajoutant ces deux éléments uniquement s'ils sont disponibles, on a plus de notice.

Par ailleurs, tu noteras que j'ai fait sauter le « @ » devant le getimagesize en rajoutant un double test, le premier qui vérifie l'existence du fichier, le second qui vérifie que c'est une image.

My 2¢ ;)
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

ViPHP
AB
ViPHP | 5818 Messages

29 oct. 2012, 21:41

Salut Cyrano

Oui ta méthode est effectivement plus élégante.

Mais bon je me suis pas pris la tête car cette classe est surtout conçue pour être utilisée avec les méthodes définies dans le mode d'emploi, et aucune d'entre elle n'utilise les infos bits et channels.

Si je les ai récupérées dans le code initial c'est que je voulais contrôler la mémoire nécessaire pour les redimensionnements d'images et ainsi pouvoir intercepter l'erreur plutôt que d'avoir une page vide avec l'annonce serveur.

En fait, faute de trouver une solution théorique (j'ai cherché pas mal mais sans succès) j'ai utilisé cette fonction empirique. Et en contrôlant les résultats je me suis aperçu que cela fonctionnait correctement pour les images de type jpg/jpeg mais pas pour les images de type png ou gif. Je réserve donc finalement le contrôle de la mémoire nécessaire uniquement pour les redimensionnements d'images de type jpg/jpeg.

Ce qui fait que je n'ai plus besoin des infos bits et channels, et jamais eu besoin d'ailleurs, car je n'ai pas mis en ligne de version contrôlant la mémoire nécessaire pour les redimensionnements d'images autres que jpg/jpeg, comme l'indique ma note "important" en bas du chapitre "Redimensionner, optimiser des images" dans le mode d'emploi.
Mais bon je n'avais pas supprimé (oubli) la récupération de ces informations... et donc la notice parfois envoyée en local était d'autant plus facile à supprimer :wink:

Voilà c'était les détails de cette petite histoire :)
Dernière édition par AB le 30 oct. 2012, 03:14, édité 3 fois.

ViPHP
AB
ViPHP | 5818 Messages

30 oct. 2012, 00:47

Bonjour,

Dernière mise à jour, vous pouvez rechercher dans le code de la classe, cette ligne
$match = isset($extension)? '#'.$file.'[0-9]+'.$ext.'#' : '#'.$file.'[0-9]+$#';
et la remplacer par
$match = isset($extension)? '#^'.$file.'[0-9]+'.$ext.'$#' : '#^'.$file.'[0-9]+$#';
Sinon dans certains cas très particuliers (peu fréquent) la fonction de renommage pouvait renommer un fichier déjà existant avec un nom inattendu (concernait uniquement le mode de renommage incrémentiel).

Je ne peux plus éditer les messages anciens dans ce nouveau forum, et donc je ne peux pas mettre à jour directement le code de la classe qui est dans mon premier message #-o
J'ai cependant trouvé une solution alternative et vous pouvez trouver le code complet qui inclus les dernières mises à jours sur le lien suivant : classe d'upload

ViPHP
AB
ViPHP | 5818 Messages

21 mars 2013, 05:03

Dernière version 2.4 sur ce lien
Le mode d'emploi du premier message de ce topic n'est donc plus à jour (impossible de l'éditer) car d'autres fonctions ont été ajoutées :

Personnalisation plus facile des messages d'information (2 fonctions ajoutées) :
- Set_Message_court()
- Set_Separateur_dimImg()

et amélioration de la gestion des erreurs :
- Gestion de l'erreur max_file_uploads
- Renforcement de la gestion de l'erreur post_max_size

Nouveau mode d'emploi


Vous pouvez aussi télécharger le code + le mode d'emploi dans un fichier zip ici (le mode d'emploi est beaucoup plus agréable à lire car c'est un fichier pdf formaté)

ViPHP
AB
ViPHP | 5818 Messages

06 mars 2014, 18:13

Mise à jour version 2.8

- L'utilisation de la fonction "Set_Message_court" sans indiquer de paramètre, permet de ne faire afficher que les messages d'erreur.

- Le tableau multidimensionnel de résultats obtenu par la fonction "Get_Tab_upload ()" contient maintenant les noms des fichiers originaux en complément de leur nom définitif (renommés si besoin).

- L'index "resultat" de ce tableau renvoi un tableau vide si aucun fichier n'a été téléchargé (formulaire vide, ou erreur, ou extension non autorisée).

Deux nouvelles fonctions :

- Set_Message_champVide ()
- Set_Max_poidsFicher ()

Set_Message_champVide () permet de retourner un message si aucun fichier n'a été proposé au téléchargement ou si un champ particulier de téléchargement à été laissé vide (accepte une chaine de caractère ou un tableau).

Set_Max_poidsFicher () permet de limiter le poids maximum des fichiers téléchargés. C'est une alternative plus sécurisée par rapport à l'utilisation d'un champ "MAX_FILE_SIZE" ..." placé dans le formulaire. Cette fonction accepte des octets ou un nombre suivi des unités de poids standard par exemple Set_Max_poidsFicher ('2,5 Mo')

Ces deux fonctions sont documentées dans le (nouveau) mode d'emploi.

- Correction d'un petit bug marginal (renommage incrémentiel des fichiers sans extension)
- Préservation de la transparence pour les png avec transparence

Code ici et mode d'emploi dans le message suivant.

ViPHP
AB
ViPHP | 5818 Messages

22 nov. 2014, 19:19

Bonjour,

Classe version 3.1

1/ Nouvelles fonctions :

- Gestion des suffixes et/ou préfixes pour permettre plusieurs redimensionnements d'une même image vers un même répertoire. Il suffit pour cela de passer un tableau comme troisième paramètre à la fonction "Set_Redim()"

- Set_Max_nombreFichers() contrôle le nombre maximum de fichiers (pour un téléchargement multiple).

- Dim_Prop_max() retourne des dimensions proportionnelles maximales d'une image.

- Return_Config_serveur() retourne la configuration du serveur utile à l'upload/redimensionnement.


2/ Des améliorations :

- Les messages d'erreurs post_max_size, upload_max_filesize et max_file_uploads renvoient maintenant le maximum possible en complément.

- Le tableau des extensions autorisées est formaté en minuscule (il fallait auparavant implicitement le fournir en minuscules).

- La fonction "Set_Renomme_fichier()" accepte maintenant un second paramètre pour permettre de respecter la casse lors de la recherche de fichiers de nom identiques pour le renommage en mode incrémentiel. A n'utiliser que si besoin et uniquement sur les serveurs unix (ou serveurs qui respectent la casse...).


3/ Dossier de test prêt à l'emploi :

Pour facilité son utilisation, la classe est maintenant fournie dans un dossier pré configuré qui contient plusieurs exemples ainsi que le mode d'emploi. Il vous suffira donc de copier ce dossier sur votre serveur puis de choisir un des fichiers d'exemples proposés pour faire les premiers tests.


Ce forum ne permet pas de proposer des fichiers en téléchargement... c'est pourquoi vous devrez vous rendre ici pour télécharger le dossier pré configuré incluant la classe, les fichiers d'exemples ainsi que le mode d'emploi.

ViPHP
AB
ViPHP | 5818 Messages

29 mai 2015, 20:09

La version 3.2 en téléchargement ci-dessous corrige une petite erreur dans le fichier d'exemple "Formulaire_inscription_simple.php".
Vous ne pouvez pas consulter les fichiers insérés à ce message.

Petit nouveau ! | 1 Messages

22 sept. 2016, 11:07

Bonjour je suis entrain de vouloir mettre en place un forum mais je voudrais que les images poster par les utilisateurs dans une discussion soient hébergées par mon site et au lieu de passer par un site d'hébergement d'image le truc c'est que à chaque fois qu'un utilisateur ajoute une image je voudrais pouvoir la redimensionnée avec une taille fixe que je cherche à avoir auprès de vous grâce à php et aussi comment éviter que lors du redimensionnement il n'y ai une rotation de l'image car j'ai eu un problème du genre dans le en utilisant cette classe pardon de déterrer un vieux topic ... Merci