Afficher une image sans connaître son extension !

Mammouth du PHP | 545 Messages

15 déc. 2007, 11:16

Salut,

Je voudrai savoir s'il existe un truc pour connaître l'extension d'un fichier ?
Je gère un site qui fait de la pub pour des courses à pied. Chaque organisateur envoie ses photos pour que je puisse les uploader dans un dossier ... mon site affiche les photos mais voilà sous quel format les organisateurs me l'on envoyé ?
Pour l'heure, j'utilise ceci:
<?php
$path = realpath('.') . '/components/com_classement/course/'; 
$photo = 'b_'. $epreuve->lastname . '.jpg'; 
       
if (!file_exists($path . $photo)) {
  $photo = 'banniere.jpg'; 
  } 
				
echo '<img src="/components/com_classement/course/' . $photo . '" width="100%" height="150" title="' . htmlentities($epreuve->epreuve)
 . '">';
?>
Comme on peut le remarquer, je mets l'extension .jpg mais j'ai plein d'autres images dans des formats .gif, .png, ... et je n'ai pas envie de perturber les organisateurs avec des futilités qu'il est peut-être possible de régler avec un script ... non, je n'ai pas envie non plus de tout rééditer :evil:

D'avance merci
Sebe

Pour moi, le PHP est une nouvelle aventure qui a commencée fin octobre 2005 ... c'est plus exitant que le HTML!

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

15 déc. 2007, 11:34

Il y a plusieurs façon de faire... la plus simple est sans doute de parser le nom du fichier.
Avec la fonction strrpos() tu peux trouver la position du dernier '.' dans le nom du fichier, et avec la fonction substr() tu peux récupérer la chaine située après le point :)

Une autre solution (PHP5) un peu plus lourde, mais aussi plus propre dans la mesure où l'extension ne révelle en rien le véritable type du fichier (elle donne juste au système l'info sur le logiciel à utiliser), il te faut utiliser la fonction getimagesize() qui te retourne la taille de l'image mais également son type, puis utiliser image_type_to_extension() pour obtenir l'extension associée.
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

ViPHP
AB
ViPHP | 5818 Messages

15 déc. 2007, 19:25

Une autre solution (PHP5) un peu plus lourde, mais aussi plus propre dans la mesure où l'extension ne révelle en rien le véritable type du fichier (elle donne juste au système l'info sur le logiciel à utiliser), il te faut utiliser la fonction getimagesize() qui te retourne la taille de l'image mais également son type, puis utiliser image_type_to_extension() pour obtenir l'extension associée.
Rien à dire sur le principe. Juste pour dire que getimagesize() est disponible depuis PHP4. En récupérant l'index 2 du tableau de getimagesize() on devrait pouvoir se passer de image_type_to_extension() (disponible depuis php5) sachant que les valeurs retournées correspondent à
   $types = array(
        1 => 'GIF',
        2 => 'JPG',
        3 => 'PNG',
        4 => 'SWF',
        5 => 'PSD',
        6 => 'BMP',
        7 => 'TIFF(intel byte order)',
        8 => 'TIFF(motorola byte order)',
        9 => 'JPC',
        10 => 'JP2',
        11 => 'JPX',
        12 => 'JB2',
        13 => 'SWC',
        14 => 'IFF',
        15 => 'WBMP',
        16 => 'XBM'
    );
Pour ceux qui n'ont pas encore php5...

ViPHP
ViPHP | 4674 Messages

15 déc. 2007, 19:35

Une autre possibilité qui serait intéressante d'étudier. Car là, tu vas utiliser des ressources à chaque fois que tu veux afficher l'image pour retrouver son extension. Il y a une autre solution donc : transformer toutes les images vers un format précis. Par exemple, tu transformes toutes tes images vers du jpeg, ou du png. Comme ça, tu forces un format, donc une extension.

Le seul point faible du système, c'est que s'il y a plusieurs formats, c'est pour une raison précise. La taille, le nombre de couleur etc., entre en compte. Forcer un format n'est pas toujours une bonne idée sauf si on connait exactement le but des images. Par exemple pour un forum, si on veut permettre aux utilisateurs d'avoir un pulsar (par comme sur PHPFrance hehe ;-)), on connait le but de l'image, donc on peut forcer du jpeg (le choix le plus judicieux par exemple).

À étudier donc, mais je ne pense pas que ce soit une idée à mettre de côté.
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

ViPHP
AB
ViPHP | 5818 Messages

15 déc. 2007, 19:49

Une autre possibilité qui serait intéressante d'étudier. Car là, tu vas utiliser des ressources à chaque fois que tu veux afficher l'image pour retrouver son extension...
On pourrait plutôt imaginer saisir cette valeur une fois pour toute au téléchargement de l'image :wink:

Mammouth du PHP | 545 Messages

16 déc. 2007, 00:55

Re,

J'ai un peu regardé ce que Ryle me proposait:
<?php
function filename_extension($photo) {
    $pos = strrpos($photo, '.');
    if($pos===false) {
        return false;
    } else {
        return substr($photo, $pos+1);
    }
}
$photo = 'p_'. $epreuve->lastname . '.gif';
$ext = filename_extension($photo);
echo '<tr><td>$extension = ' . $ext . '</td></tr>'; // donne bien gif
?>
Maintenant, je ne suis sur que d'une chose ... la 1er partie de l'image !
$photo = 'p_'. $epreuve->lastname . '.';
L'extension, je ne la connais pas ... comment puis-je la trouver ?

Pour la proposition de AB qui est de faire un tableau ... je vais devoir tester si le fichier existe avec chacune des extensions ?

Merci à vous tous
Sebe

Pour moi, le PHP est une nouvelle aventure qui a commencée fin octobre 2005 ... c'est plus exitant que le HTML!

Administrateur PHPfrance
Administrateur PHPfrance | 3131 Messages

16 déc. 2007, 01:18

glob() pourra te permettre de résoudre ton problème

ViPHP
AB
ViPHP | 5818 Messages

16 déc. 2007, 22:15

Oups, c'est vrai que j'apportais quelques précisions sur le commentaire de Ryle mais ça ne répondait pas à ton pb.

naholyr nous a remis sur la bonne voie.

Ton code devrait ressembler à quelque chose comme
$path = realpath('.') . '/components/com_classement/course/'; 

$fichier = $path.'b_'. $epreuve->lastname; 

$test = glob("$fichier.*");

if (isset($test[0])) {$photo = $test[0];}
	
if (isset($photo)) {			
echo '<img src="/components/com_classement/course/' . $photo . '" width="100%" height="150" title="' . htmlentities($epreuve->epreuve)
 . '">';}

Mammouth du PHP | 545 Messages

17 déc. 2007, 00:44

Re,

Avec cette dernière suggestion, j'y suis arrivée ... j'ai dû changer quelques babioles pour arriver à afficher mon image. Voici le code:
$path = realpath('.') . '/components/com_classement/course/'; 
$fichier = $path. 'b_' . $epreuve->lastname; 
$test = glob("$fichier.*");
				
foreach($test AS $file) {
   $file = str_replace($path, '', $file);
   }
				
if (!file_exists($path . $file)) {
	$file = 'banniere.jpg'; 
	} 
				
echo '<img src="/components/com_classement/course/' . $file . '" width="100%" height="150" title="' . htmlentities($epreuve->epreuve) . '">';
Est-ce que mon code est correcte comme cela ?

Merci
Sebe

Pour moi, le PHP est une nouvelle aventure qui a commencée fin octobre 2005 ... c'est plus exitant que le HTML!

ViPHP
AB
ViPHP | 5818 Messages

17 déc. 2007, 02:07

Si ça fonctionne c'est ok
Te reste plus qu'à mettre résolu :wink:

Cela dit je vois pas trop pourquoi tu fais un realpath...

Mammouth du PHP | 545 Messages

17 déc. 2007, 10:09

Salut,
Si ça fonctionne c'est ok
Te reste plus qu'à mettre résolu :wink:

Cela dit je vois pas trop pourquoi tu fais un realpath...
En fait, je construis un composant pour [Joomla!] ... je ne sais pas où l'utilisateur de mon composant le mettra ! Maintenant, il faut savoir que je fais mon apprentissage (en matière de programmation) sur le tas et, comme tu as pu le voir, je ne connais pas toutes les fonctions existantes ... il me faut les découvrir grâce aux questions que je me pose et aux réponses que l'on me donne :D

Encore une fois merci pour ce coup de main
__________________________________________________________________________________
EDIT
__________________________________________________________________________________
Peit changement pour que cela fonctionne quand le fichier est vide
if (!file_exists($path . $file)) {
	$file = 'banniere.jpg'; 
	} 
A remplacer par
if ($file == '') {
  $file = 'banniere.jpg'; 
  } 
Sebe

Pour moi, le PHP est une nouvelle aventure qui a commencée fin octobre 2005 ... c'est plus exitant que le HTML!