Page 1 sur 1

Afficher une image sans connaître son extension !

Posté : 15 déc. 2007, 11:16
par Sebe
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

Posté : 15 déc. 2007, 11:34
par Ryle
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.

Posté : 15 déc. 2007, 19:25
par AB
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...

Posté : 15 déc. 2007, 19:35
par Hywan
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é.

Posté : 15 déc. 2007, 19:49
par AB
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:

Merci pour vos réponses

Posté : 16 déc. 2007, 00:55
par Sebe
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

Posté : 16 déc. 2007, 01:18
par naholyr
glob() pourra te permettre de résoudre ton problème

Re: Afficher une image sans connaître son extension !

Posté : 16 déc. 2007, 22:15
par AB
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)
 . '">';}

Oki ... je vois le bout !

Posté : 17 déc. 2007, 00:44
par Sebe
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

Posté : 17 déc. 2007, 02:07
par AB
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...

Posté : 17 déc. 2007, 10:09
par Sebe
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'; 
  }