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.
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.