IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Fiabiliser la détection du type Mime d'un fichier [Tutoriel]


Sujet :

Langage PHP

  1. #1
    Membre actif
    Homme Profil pro
    Responsable d'une MOE bancaire
    Inscrit en
    Juillet 2003
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Responsable d'une MOE bancaire

    Informations forums :
    Inscription : Juillet 2003
    Messages : 261
    Points : 226
    Points
    226
    Par défaut Fiabiliser la détection du type Mime d'un fichier
    Bonjour,

    je demande votre avis sur un problème que je rencontre. En effet, je cherche la methode la plus efficace pour connaite le mime d'un fichier uploadé :

    - il y a $_FILES['userfile']['type'] : ca fonctionne mais on peut le detourner facilement en changeant l'extension du fichier ou en dedouillant les parametres du navigateur

    - Se baser sur l'extension du fichier : coté sécurité, c'est meme pas la peine

    - mime_content_type : ca fonctionne avec un moyen inferieur à 1/10 et dans la plus part des cas elle renvoi une chaine vide

    - les fonctions finfo (PECL) : la version actuelle est buguée (elle renvoi tout le temps 'application/x-dpkg'), mais meme si on contourne le probleme en supprimant tous les ! du fichier magic.mime, le resultat est tres loin d'etre satisfaisant

    - je suis sur windows (apache), alors les commandes genre 'file -bi $filename' ne sont pas possible

    voila, vous pouvez remarquez que je postule pas par hasard mais apres une longue recherche et des nombreuses experiences. C'est pour cette raison que je me tourne vers vous pour vous demander si vous connaissez soit : une autre methode fiable pour trouver le mime d'un fichier, ou tout simplement comment améliorer les resultats d'une des methodes citées ci-dessus.

    merci bcp d'avance

  2. #2
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Eternel problème... Même sous *nix, le "file -bi" ne retourne pas toujours un résultat cohérent (genre Word pour un Powerpoint )
    Tu peux éventuellement jeter un oeil à
    http://www.freedesktop.org/wiki/Stan..._2dinfo_2dspec
    http://www.freedesktop.org/wiki/Soft...ared-mime-info


  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    297
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 297
    Points : 303
    Points
    303
    Par défaut
    les quelques premier octect contient souvant des trucs genre
    GIF, JFIF...

    c'est vrais que ça ne sera de toute façon jamais fiable...

    Personnellement, je te conseillerai d'établir un liste des entêtes de fichier type
    puis avec un file() de prendre la première ligne et de contrôlé cette entête avec les types que tu à établies.

    (certain fichier n'ont pas d'entête)

  4. #4
    Membre actif
    Homme Profil pro
    Responsable d'une MOE bancaire
    Inscrit en
    Juillet 2003
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Responsable d'une MOE bancaire

    Informations forums :
    Inscription : Juillet 2003
    Messages : 261
    Points : 226
    Points
    226
    Par défaut
    c'est bien ce que je disais, c pas du cadeau!! mais bon j'ai un peu l'habitude maintenant!
    Personnellement, je te conseillerai d'établir un liste des entêtes de fichier type
    oui ce genre de liste sont deja disponibles dans mon programme
    file() de prendre la première ligne et de contrôlé cette entête avec les types que tu à établies
    j'utilisais bien ce principe pour identifier les fichiers OpenOffice, c'est pas parfait ma ca fonctionne pas mal. Bon bein si vous dites qu'il y a que ça à faire, alors j'essayerai de le generaliser sur tous les autres types
    (certain fichier n'ont pas d'entête)
    tu veux dire qu'il y a des types de fichier qui n'ont pas d'etetes? parce que à la limite si j'arrive à les identifier je pourrais utiliser une autre methode pour connaitre leurs mimes!!
    mais si tu veux dire que dans le meme type de fichier (word par exemple), il y a des documents qui ont des entetes et d'autres ne l'ont pas! ça ca va me tuer!
    en tout cas je vais me plonger à developper un petit algo qui fera l'affaire, je vais le tester et ensuite vous le proposer pour une éventuelle vérification

    comme on dit plusieurs tetes qui pensent c'est tjs mieu qu'une

    EDIT : pour j'avoue que je comprend que dale de ce qu'ils cherchent à faire mais promis je regarderai ca de plus pres ce soir

  5. #5
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Ou comment reinventer la roue
    C'est justement le role de magic.mime
    Code magic.mime : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    ...
    # msword: file(1) magic for MS Word files
    #
    # Contributor claims:
    # Reversed-engineered MS Word magic numbers
    #
     
    0       string          \376\067\0\043                  application/msword
    0       string          \320\317\021\340\241\261        application/msword
    0       string          \333\245-\0\0\0                 application/msword
     
    ...

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    297
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 297
    Points : 303
    Points
    303
    Par défaut
    Les fichiers textes par exemples, n'ont pas d'entête par il sont brute.

    Mais malheureusement, beaucoup de fichiers ne peuvent être identifié uniquement grâce à leur extension

    Je pense qu'il faudrait crée une base, avec 2 types d'informations en fonction du type de fichier:
    les éléments que l'on retrouve à coup sure (JFIF, GIF)
    le nombre de d'octet maximum ou trouvé ses éléments (11, 3)

  7. #7
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    297
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 297
    Points : 303
    Points
    303
    Par défaut
    désolé :p on a posté en même temps :p j'avais pas vue

  9. #9
    lr
    lr est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    338
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2003
    Messages : 338
    Points : 114
    Points
    114
    Par défaut
    Salut,

    Qqun aurait-il un exemple pour utiliser magic mime ?

  10. #10
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    http://php.net/mime_content_type

    Les commentaires de la doc sont à lire aussi, on trouve parfois des perles.
    Par exemple, une version de `file` pour win32 :
    http://gnuwin32.sourceforge.net/packages/file.htm

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    297
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 297
    Points : 303
    Points
    303

  12. #12
    Membre actif
    Homme Profil pro
    Responsable d'une MOE bancaire
    Inscrit en
    Juillet 2003
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Responsable d'une MOE bancaire

    Informations forums :
    Inscription : Juillet 2003
    Messages : 261
    Points : 226
    Points
    226
    Par défaut
    comme Mr N. a dit, on va pas chercher à réinventer la roue. Du coup, je me suis intéressé à la version de `file` pour win32 : Elle est facile à installer et à utiliser, elle utilise aussi le mime.magic mais détecte bcp plus de type qu'avec le mime_content_type ou fileinfo

    seul regret pour moi, c'est qu'elle arrive pas à détecter le powerpoint (envoi chaîne vide) : si j'arrive à la faire fonctionner sûrement en bidouillant le magic.mime, ca sera parfait!!

    Pour des fichiers de text brute, il renvoi une chaîne qui contient text/plain + d'autres détails, mais bon c pas très grave, il suffit de traiter ensuite la chaîne envoyé en ne récupérant que la première partie

    en fait, est ce que quelqu'un a une idée de ce qu'il faut ajouter dans le magic.mime pour détecter le powertpoint?

  13. #13
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Citation Envoyé par SegmentationFault
    Pour des fichiers de text brute, il renvoi une chaîne qui contient text/plain + d'autres détails, mais bon c pas très grave, il suffit de traiter ensuite la chaîne envoyé en ne récupérant que la première partie
    file -bi, suivi d'un explode sur le point virgule non ?

  14. #14
    Membre actif
    Homme Profil pro
    Responsable d'une MOE bancaire
    Inscrit en
    Juillet 2003
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Responsable d'une MOE bancaire

    Informations forums :
    Inscription : Juillet 2003
    Messages : 261
    Points : 226
    Points
    226
    Par défaut
    Citation Envoyé par Mr N.
    file -bi, suivi d'un explode sur le point virgule non ?
    tout à fait!

    T'as pas une idée pour le powerpoint?!

  15. #15
    lr
    lr est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    338
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2003
    Messages : 338
    Points : 114
    Points
    114
    Par défaut
    J'ai fais un test en appelant "file" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    calc.ods  	application/x-zip
    excel.xls 	application/msword
    gif.GIF 	image/gif
    impress.odp 	application/x-zip
    jpg.jpg 	image/jpeg
    pdf.pdf 	application/pdf
    png.png 	image/png
    powerpoint.ppt 	application/msword
    rar.rar 	application/x-rar
    text.txt 	text/plain
    word.doc 	application/msword
    writer.odt 	application/x-zip
    zip.zip 	application/x-zip
    - les documents de OpenOffice Calc, Impress et Writer sont vus comme des zip. Je sais que ce sont effectivement des zip mais du coup, comment peut-on les différencier (j'imagine que le problème sera le même avec le nouveau format de MS Office)
    - excel et powerpoint sont vus comme du word

    Pensez-vous qu'il existe un moyen d'affiner ça ?

  16. #16
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Citation Envoyé par SegmentationFault
    T'as pas une idée pour le powerpoint?!
    Non Mis à part la solution de freedesktop (cf liens première réponse)... que je n'ai pas testé.

    @lr, quel est ton environnement ? Peut-etre que ton magic.mime n'est pas à jour...

  17. #17
    Membre actif
    Homme Profil pro
    Responsable d'une MOE bancaire
    Inscrit en
    Juillet 2003
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Responsable d'une MOE bancaire

    Informations forums :
    Inscription : Juillet 2003
    Messages : 261
    Points : 226
    Points
    226
    Par défaut
    Citation Envoyé par lr
    J'ai fais un test en appelant "file" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    calc.ods  	application/x-zip
    excel.xls 	application/msword
    gif.GIF 	image/gif
    impress.odp 	application/x-zip
    jpg.jpg 	image/jpeg
    pdf.pdf 	application/pdf
    png.png 	image/png
    powerpoint.ppt 	application/msword
    rar.rar 	application/x-rar
    text.txt 	text/plain
    word.doc 	application/msword
    writer.odt 	application/x-zip
    zip.zip 	application/x-zip
    - les documents de OpenOffice Calc, Impress et Writer sont vus comme des zip. Je sais que ce sont effectivement des zip mais du coup, comment peut-on les différencier (j'imagine que le problème sera le même avec le nouveau format de MS Office)
    - excel et powerpoint sont vus comme du word

    Pensez-vous qu'il existe un moyen d'affiner ça ?
    c'est bizzare que ca te donne application/msword pour excel et powerpoint! j'ai la derniere version et il me donne une chaine vide pour ces deux là, et entre nous, je prefere
    pour openoffice, à mon avis c'est plus simple, personnellement s'il me dit que c'est application/x-zip, alors je le detarre et je regarde s'il contient un fichier META-INF/manifest.xml, et normalement dans ce ficier il y a le mime. je sais c compliqué mais bon j'ai pas d'autres solution

    EDIT: pour freedesktop t'es sur Mr N. que cette appli pour fonctionner sur windows? j'ai l'impression que c'est une appli à *nix

  18. #18
    lr
    lr est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    338
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2003
    Messages : 338
    Points : 114
    Points
    114
    Par défaut
    Notre serveur tourne sur une Fedora Core 3. Il faut que je regarde comment mettre à jour le fichier, mais si c'est pour avoir des chaînes vides, pas sûr que je le fasse

    Merci pour votre aide

  19. #19
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Essaie de passe à FC5 ...

  20. #20
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Citation Envoyé par SegmentationFault
    EDIT: pour freedesktop t'es sur Mr N. que cette appli pour fonctionner sur windows? j'ai l'impression que c'est une appli à *nix
    Oui c'est à l'origine pour *nix, mais bon c'est du c, ça devrait se compiler sur win32
    Et il y a une implémentation en PHP mais le lien est mort

Discussions similaires

  1. Type MIME d'un fichier
    Par KeKeMaN dans le forum Général Java
    Réponses: 7
    Dernier message: 06/03/2007, 08h37
  2. récuperer le type mime à partir du fichier
    Par isma92 dans le forum Langage
    Réponses: 3
    Dernier message: 09/02/2007, 11h28
  3. [FTP] Connaitre le type mime d'un fichier
    Par jak0 dans le forum Langage
    Réponses: 15
    Dernier message: 18/07/2006, 11h32
  4. Type Mime d'un fichier
    Par partyboy dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 26/04/2006, 10h04
  5. [struts] déterminer le type Mime d'un fichier
    Par k4eve dans le forum Struts 1
    Réponses: 4
    Dernier message: 14/06/2004, 10h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo