Problème de récupération de type MIME

Problème de récupération de type MIME - PHP - Programmation

Marsh Posté le 05-12-2004 à 03:00:10    

Voilà, j'ai fait un formulaire de téléchargement d'image au format Jpeg et lors du traitement du formulaire, je vérifies si le fichier est bien un .jpg comme ceci :

Code :
  1. if ($_FILES['fichier']['type'] == "image/jpeg" )
  2. {
  3.         //Création d'une vignette
  4. else {
  5. //Renvoi d'erreur de format de fichier
  6. }


Lorsque j'utilise ceci sur le site de chez moi, ça fonctionne très bien, mais apparemment, chez certains utilisateurs, ça renvoie l'erreur même quand il s'agit bien d'un Jpeg :/
Savez-vous d'où cela peut-il venir ?
 
Pour info, j'héberge chez free.


Message édité par nero27 le 06-12-2004 à 00:26:31
Reply

Marsh Posté le 05-12-2004 à 03:00:10   

Reply

Marsh Posté le 05-12-2004 à 11:34:22    

:bounce:

Reply

Marsh Posté le 06-12-2004 à 00:00:17    

UP

Reply

Marsh Posté le 06-12-2004 à 01:45:41    

Le problème c'est le navigateur du client.
C'est lui qui "décide" du type mime du fichier qu'il envoie et non PHP. Tu ne dois donc pas trop lui faire confiance.
 
Le problème en fait c'est que suivant le navigateur et l'image, le type mime peut changer. Et comme il n'y a pas vraiement de norme...
 
EN fait pour le JPEG je connais au moins 2 types:
image/jpeg
image/pjpeg
 
Le plus sûr, c'est encore de vérifier que le fichier reçu est bien une image jpeg : http://www.php.net/manual/fr/funct [...] getype.php
 
EDIT : Avec la lib GD, il y a aussi http://www.php.net/manual/fr/function.getimagesize.php qui donne plus d'infos, ce qui peut être interessant si tu veux par exemple limiter la taille des images...


Message édité par Mara's dad le 06-12-2004 à 01:50:42

---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 06-12-2004 à 02:13:17    

Merci beaucoup Mara's dad pour ces précisions :jap:
 
Ah, rien de tel que les habitués pour obtenir de l'aide :)

Reply

Marsh Posté le 06-12-2004 à 02:54:44    

Bon, je viens de tester...
voilà le code comme il est maintenant

Code :
  1. if (exif_imagetype($_FILES['fichier']['tmp_name']) == 2)
  2. {
  3.     //Création d'une vignette
  4. else {
  5.     //Renvoi d'erreur de format de fichier
  6. }


 
J'ai testé ca avec qq1 chez qui ca ne marchait pas et c'est toujours pareil :/
J'ai aussi testé en mettant la ligne de test comme ceci :  

Code :
  1. if (exif_imagetype($_FILES['fichier']['tmp_name']) == IMAGETYPE_JPEG)


Mais ça ne fonctionne pas non plus :(
 
Peut etre cela vient-il du fait que j'utilise $_FILES['fichier']['tmp_name'] : qu'en pensez-vous ?


Message édité par nero27 le 06-12-2004 à 02:56:38
Reply

Marsh Posté le 06-12-2004 à 09:00:08    

J'ai testé ton code chez free et ça marche bien !
 
Si ça marche pas avec ton pote, c'est que le fichier n'est pas bon :) ou trop gros...
 
affiche la valeur de exif_imagetype($_FILES['fichier']['tmp_name']) et demande à ton pote ce qui se passe...
 
Exemple avec getimagesize :

<?php
echo( "<pre>Début info image\n" );
print_r( getimagesize($_FILES['fichier']['tmp_name']) );
echo( "Fin info image</pre>" );
?>
<BR>
<FORM ENCTYPE="multipart/form-data" ACTION="up.php" METHOD="POST">
<INPUT TYPE=hidden name="MAX_FILE_SIZE" value="204800">
Fichier à envoyer : <INPUT TYPE="FILE" name="fichier" size=80> (Max 200Ko)<BR>
<INPUT TYPE="submit" VALUE="Envoyer !">
</FORM>


 
Avec un fichier jpeg, ça donne :

Début info image
Array
(
    [0] => 200
    [1] => 15
    [2] => 2
    [3] => width="200" height="15"
    [bits] => 8
    [channels] => 3
    [mime] => image/jpeg
)
Fin info image


 
Avec un fichier qui n'est pas une image :

Début info image
Fin info image


Message édité par Mara's dad le 06-12-2004 à 09:11:21

---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 06-12-2004 à 12:10:53    

je parie que tu as simplement oublié ça ENCTYPE="multipart/form-data" dans la balise form de ton formulaire.. nan ?

Reply

Marsh Posté le 08-12-2004 à 01:11:40    

Non non, ça, ça y est bien ;)
Ca fonctionne pour la plupart des gens, sauf quelques rares cas :/
Mais apparemment c'est réglé en utilisant la fonction getimagesize() de Mara's Dad :)
Merci bcp :jap:

Reply

Marsh Posté le 08-12-2004 à 11:51:06    

nero27 a écrit :


Mais apparemment c'est réglé en utilisant la fonction getimagesize() de Mara's Dad :)
Merci bcp :jap:


 
De rien, m'enfin, faut pas dire que c'est MA fonction :o, l'auteur pourrait ne pas aprécier...
 
 
Par couriosité, t'as essayé d'afficher la valeur de exif_imagetype($_FILES['fichier']['tmp_name']) pour ceux chez qui ça marche pas ?


Message édité par Mara's dad le 08-12-2004 à 11:52:52

---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 08-12-2004 à 11:51:06   

Reply

Marsh Posté le 09-12-2004 à 01:47:00    

Mara's dad a écrit :

Par couriosité, t'as essayé d'afficher la valeur de exif_imagetype($_FILES['fichier']['tmp_name']) pour ceux chez qui ça marche pas ?


Oui, je l'ai fait, c'est aussi efficace que getimagesize() ;)

Reply

Marsh Posté le 09-12-2004 à 12:08:26    

Arf t'as pas compris la question, faut dire que j'étais pas clair du tout :/
 
Chez ceux qui avait un problème avec la méthode :
if( $_FILES['fichier']['type'] == "image/jpeg" )
et qui maintenant passent, quelle est donc la valeur de :
$_FILES['fichier']['type'] ?
 
Je parie sur "image/pjpeg" !
 
Me trompe-je ?


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 09-12-2004 à 12:16:12    

Mara's dad a écrit :


Je parie sur "image/pjpeg" !
 
Me trompe-je ?


 
sur IE seulement [:itm]
p pour progressif  
Que du régal ...


---------------
from here and there -- \o__________________________________ -- la révolution de la terre, en silence
Reply

Marsh Posté le 09-12-2004 à 14:50:55    

simogeo a écrit :

sur IE seulement [:itm]
p pour progressif  
Que du régal ...


Oui je sais bien .
En même temps, c'est un peu normal d'avoir un type mime différent.
Y'a des softs incapable de lire les jpegs progressifs :/


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 09-12-2004 à 15:05:32    

Mara's dad a écrit :

Oui je sais bien .
En même temps, c'est un peu normal d'avoir un type mime différent.
Y'a des softs incapable de lire les jpegs progressifs :/


 
suis d'accord avec ça.
Mais dans ce cas là, il faudrait normaliser tout ça [:spamafote]


Message édité par simogeo le 09-12-2004 à 15:05:39

---------------
from here and there -- \o__________________________________ -- la révolution de la terre, en silence
Reply

Marsh Posté le 09-12-2004 à 16:13:06    

Tu te propose ?


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 09-12-2004 à 16:14:03    

Mara's dad a écrit :

Tu te propose ?


 
[:ddr555]
c'est pas vraiment ma place


---------------
from here and there -- \o__________________________________ -- la révolution de la terre, en silence
Reply

Marsh Posté le 09-12-2004 à 16:46:22    

Extrait de la rfc2046
 

A media type of "image" indicates that the body contains an image.
   The subtype names the specific image format.  These names are not
   case sensitive. An initial subtype is "jpeg" for the JPEG format
   using JFIF encoding [JPEG].
 
   The list of "image" subtypes given here is neither exclusive nor
   exhaustive, and is expected to grow as more types are registered with
   IANA, as described in RFC 2048.
 
   Unrecognized subtypes of "image" should at a miniumum be treated as
   "application/octet-stream".  Implementations may optionally elect to
   pass subtypes of "image" that they do not specifically recognize to a
   secure and robust general-purpose image viewing application, if such
   an application is available.
 
   NOTE: Using of a generic-purpose image viewing application this way
   inherits the security problems of the most dangerous type supported
   by the application.


 
Allons donc voir la rfc2048 ...
 

2.5.  Location of Registered Media Type List
 
   Media type registrations will be posted in the anonymous FTP
   directory "ftp://ftp.isi.edu/in-notes/iana/assignments/media-types/"
   and all registered media types will be listed in the periodically
   issued "Assigned Numbers" RFC [currently STD 2, RFC 1700].  The media
   type description and other supporting material may also be published
   as an Informational RFC by sending it to "rfc-editor@isi.edu" (please
   follow the instructions to RFC authors [RFC-1543]).


 
Heu, pas très clair tout ça. On essaye la RFC1700?
 

image           jpeg                                    [RFC1521,NSB]
                gif                                     [RFC1521,NSB]
                ief             Image Exchange Format       [RFC1314]
                tiff            Tag Image File Format           [MTR]


Bof, un peu light tout ça, mais bon il semble que ce soit l'IANA qui soit chargé de gérer les type MIME...
 
Un petit tour chez IANA...
 
Yes, c'est mieux, mais pas de pjpeg :/
 
On le trouve chez kro$oft  
 
Mais qui donc à pondu ce type ?
 
D'après ce site pjpeg est apparu avec IE4, et il semble que kro$oft ne se donne pas la peine de faire enregistrer les type MIME qu'il pond :/
Par exemple application/msword est enregistré, mais c'est pas kro$oft qui l'a fait.
En fait quand t'en a marre de te coltiner les types pondu pas kro$oft, la seule chose à faire est de demander l'enregistrement toi même :fou:
Chez bilou y z'en ont rien à péter des autres, de toute façon y utilisent que des softs propriétaires, donc pas de problème. Re :fou:


Message édité par Mara's dad le 09-12-2004 à 16:46:59

---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 09-12-2004 à 22:36:18    

Mara's dad a écrit :

Arf t'as pas compris la question, faut dire que j'étais pas clair du tout :/
 
Chez ceux qui avait un problème avec la méthode :
if( $_FILES['fichier']['type'] == "image/jpeg" )
et qui maintenant passent, quelle est donc la valeur de :
$_FILES['fichier']['type'] ?
 
Je parie sur "image/pjpeg" !
 
Me trompe-je ?


Ah, c'est vrai, j'avais pas pensé à faire ça, afficher son type mime :pt1cable:
Mais le problème, c'est que la personne qui m'aidait était au canada et n'y connais pas grand chose en info :/

Reply

Marsh Posté le 17-12-2004 à 23:36:22    

Bon, alors je rencontre encore quelques problèmes, mais c'est plus rare : pour tester, je m'envoie la valeur de $_FILES['fichier']['tmp_name'] par mail et lorsque je vais la voir, elle est vide :/
 
Qu'en pensez-vous ?
 

Reply

Marsh Posté le 17-12-2004 à 23:56:03    

Je pense qu'on t'as rien envoyé :D
 
Que dit is_uploaded_file ?


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 17-12-2004 à 23:58:53    

Ah, je connaissais pas cette fonction : je vais tester avec ça ;)
Mais comment se fait-il que la photo ne soit pas envoyée ?
Ca peut être du à quoi ? un firewall ?
 
EDIT : je l'utilise comment ? Comme ça is_uploaded_file($_FILES['fichier']['tmp_name']) ?


Message édité par nero27 le 18-12-2004 à 00:00:19
Reply

Marsh Posté le 18-12-2004 à 00:16:48    

Moi, je l'utilise avec le name du <input type="file"...
Donc 'fichier' pour toi.
 
Pour une fois, la doc est mal foutue la dessus :/


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 18-12-2004 à 00:35:54    

Ok, je vais tester ;)
 
C'est vrai que là, la doc est un peu faible :/
Mais bon, c'est quand même rare ici, pas comme sur nexen.net [:ddr555]

Reply

Marsh Posté le 18-12-2004 à 01:22:09    

Bon, j'ai testé et effectivement, le fichier n'est pas envoyé !
Qu'en pensez-vous ? un firewall qui bloquerait l'envoi du fichier ?
 
Apparemment, cette personne (peu calée en info) utilise le firewall d'XP et AVG comme antivirus.

Reply

Marsh Posté le 18-12-2004 à 01:26:24    

C'est pas evident mais je bien essayer, attends
 
 
http://jany.gilli.free.fr/hfr/kneudancer.gif
 
oué nan, j'ai jamais été doué pour les mimes :/

Reply

Marsh Posté le 18-12-2004 à 01:30:01    

[:nero27]  
 
 
 
 
 
 
 
 
 
 
 
:hello:

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed