4 votes

php 7.2 fichier magique finfo

J'ai un projet Laravel 5, qui permet à un utilisateur de télécharger des fichiers .ai (fichiers illustrator). Le problème est que Laravel détecte les fichiers .ai comme des applications/pdf.

Je détecte le type de mime avec cette fonction

$type = File::mimeType( $_path );

J'ai également essayé d'utiliser cette approche, mais j'ai obtenu les mêmes résultats.

$finfo = finfo_open(FILEINFO_MIME);
$mimetype = $finfo->file($_path);
finfo_close($finfo);

Je me suis dit qu'il devait s'agir d'un problème avec PHP qui ne sait pas ce qu'est un fichier .ai. J'ai creusé plus profondément dans finfo et je comprends que les définitions mime par défaut sont compilées dans PHP, mais je vois que finfo_open, a un second argument 'magic_file', qui je suppose est un endroit où vous pouvez insérer le chemin vers un fichier de définition mime différent.

J'ai essayé d'utiliser le fichier /etc/magic.mime d'Ubuntu, mais finfo m'a donné

ErrorException: finfo_open(): Warning: offset `application\/activemessage' invalid in

erreur. Je suppose que c'est parce que le fichier magic.mime n'est pas dans un format correct.

La plupart des sujets en ligne créent une fonction PHP personnalisée ou un autre type de hack pour détecter les types de mime, mais j'ai l'impression que ce n'est pas la bonne solution ici.

Où puis-je trouver des fichiers de définition mime à jour et comment puis-je les charger dans PHP ou finfo ?

Mon environnement :

Ubuntu 16.04
PHP 7.2

8voto

pantomimeParis Points 1

Je me suis dit qu'il devait s'agir d'un problème avec PHP qui ne sait pas ce qu'est un fichier . .ai. J'ai creusé plus profondément dans le finfo et j'ai compris que les définitions mime par défaut sont compilées dans PHP. mime par défaut sont compilées dans PHP, mais je vois que finfo_open, a a un second argument 'magic_file', qui, je suppose, est un endroit où vous pouvez insérer le chemin vers un fichier de définition mime différent.

El extension fileinfo essayer de deviner le type de mime en cherchant certains magie des séquences à des positions spécifiques dans le fichier. Le fichier magique est une base de données dans laquelle sont stockées autant de séquences magiques déjà connues.

J'ai un projet Laravel 5, qui permet à un utilisateur de télécharger des fichiers .ai (fichiers illustrator). Le problème est que Laravel détecte les fichiers .ai en tant que application/pdf.

Si vous suivez l'explication ci-dessus, il est normal que le fichier magique soit détecté. .ai en format pdf. Parce que Maquette Adobe Illustrator est un fichier qui peut être enregistré au format EPS ou PDF.

J'ai fait quelques recherches pour distinguer difficilement un fichier pdf général d'un fichier ai enregistré au format pdf. Tout d'abord, j'ai téléchargé des fichiers ai gratuits sur Internet, j'ai identifié les fichiers en regardant nombre magique avec les deux commandes hexdump y file .

$ hexdump -C 7_full_ai_vi_template_vector_8.ai | head
00000000  25 50 44 46 2d 31 2e 34  0d 25 e2 e3 cf d3 0d 0a  |%PDF-1.4.%......|
00000010  31 20 30 20 6f 62 6a 0d  3c 3c 20 0d 2f 54 79 70  |1 0 obj.<< ./Typ|
00000020  65 20 2f 43 61 74 61 6c  6f 67 20 0d 2f 50 61 67  |e /Catalog ./Pag|
00000030  65 73 20 32 20 30 20 52  20 0d 2f 4d 65 74 61 64  |es 2 0 R ./Metad|
00000040  61 74 61 20 38 38 20 30  20 52 20 0d 3e 3e 20 0d  |ata 88 0 R .>> .|
00000050  65 6e 64 6f 62 6a 0d 32  20 30 20 6f 62 6a 0d 3c  |endobj.2 0 obj.<|
00000060  3c 20 0d 2f 54 79 70 65  20 2f 50 61 67 65 73 20  |< ./Type /Pages |
00000070  0d 2f 4b 69 64 73 20 5b  20 35 20 30 20 52 20 5d  |./Kids [ 5 0 R ]|
00000080  20 0d 2f 43 6f 75 6e 74  20 31 20 0d 3e 3e 20 0d  | ./Count 1 .>> .|
00000090  65 6e 64 6f 62 6a 0d 33  20 30 20 6f 62 6a 0d 3c  |endobj.3 0 obj.<|
$ file 7_full_ai_vi_template_vector_8.ai
7_full_ai_vi_template_vector_8.ai: PDF document, version 1.4

Regardez les premiers octets du fichier, comme vous pouvez le voir, c'est un fichier PDF avec un nom de domaine. .ai extension.

Après cela, je l'ai ouvert avec Aperçu sur mon Mac, il sait que ce fichier est créé par Adobe Illustrator dans la boîte de dialogue Inspecteur. Il doit donc avoir un moyen de reconnaître un fichier AI enregistré au format PDF.

Inspector Dialog

La plupart des sujets en ligne créent une fonction PHP personnalisée ou autre pour détecter les types de mime, mais j'ai l'impression que ce n'est pas la solution correcte solution ici.

Où puis-je trouver des fichiers de définition de mime à jour et comment puis-je charger dans PHP ou finfo ?

J'ai cherché une solution sur Google sans succès, alors je l'ai créée moi-même, à la page 15 de Fichier Adobe Illustrator Spécification du format il est dit :

Le commentaire %%Creator identifie l'application qui a généré le fichier document en langage PostScript. Le numéro de version (version 6.0 dans la Figure 1) est un texte arbitraire, terminé par un caractère de nouvelle ligne.

Je suppose que les fichiers qui contiennent des octets magiques de pdf et des chaînes de caractères. %%Creator Adobe Illustrator au début du fichier devrait être identifié comme .ai .

Faisons-le en écrivant quelques règle magique :

$ cat ai
0       string          %PDF-           PDF document
!:mime  application/pdf
>5      byte            x               \b, version %c
>7      byte            x               \b.%c
>7      search/1000     %%Creator:\ Adobe\ Illustrator  Adobe Illustrator Document

Les scripts PHP utilisent le fichier magique personnalisé pour .ai

$ cat fileinfo.php
<?php

$magic_file = __DIR__ . '/ai';

$finfo = new finfo(FILEINFO_NONE, $magic_file);
echo $finfo->file($argv[1]) . PHP_EOL;

La sortie sera

$ php fileinfo.php ./7_full_ai_vi_template_vector_8.ai
PDF document, version 1.4 Adobe Illustrator Document

Cela fonctionne, mais je pense que ce n'est pas une bonne idée de maintenir votre propre fichier magique. Peut-être que tu peux écrire une fonction simple pour ça, détecter .ai après $type = File::mimeType( $_path ); dit que c'est un fichier pdf.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X