[英]php 7.2 finfo magic file
我有一個Laravel 5項目,我們讓用戶下載.ai(插圖文件)。 問題是Laravel將.ai文件檢測為application / pdf。
我正在使用此功能檢測MIME類型
$type = File::mimeType( $_path );
我也嘗試使用這種方法,但是得到了相同的結果
$finfo = finfo_open(FILEINFO_MIME);
$mimetype = $finfo->file($_path);
finfo_close($finfo);
我認為,PHP不知道什么是.ai文件是一個問題。 我對finfo進行了更深入的研究,我了解到默認的mime定義已編譯到PHP中,但是我看到finfo_open具有第二個參數“ magic_file”,我認為這是您可以在其中插入其他mime定義文件的路徑的地方。 。
我嘗試使用Ubuntu的/etc/magic.mime文件,但finfo給了我
ErrorException: finfo_open(): Warning: offset `application\/activemessage' invalid in
錯誤。 我認為這是因為magic.mime文件的格式不正確。
在線上的大多數主題都會創建自定義PHP函數或其他一些技巧來檢測mime類型,但我覺得這不是這里的正確解決方案。
在哪里可以找到最新的mime定義文件,如何將它們加載到PHP或finfo中?
我的環境:
Ubuntu 16.04
PHP 7.2
我認為,PHP不知道什么是.ai文件是一個問題。 我對finfo進行了更深入的研究,我了解到默認的mime定義已編譯到PHP中,但是我看到finfo_open具有第二個參數“ magic_file”,我認為這是您可以在其中插入其他mime定義文件的路徑的地方。 。
fileinfo擴展名嘗試通過在文件中的特定位置查找某些魔術序列來猜測mime類型。 魔術文件是一個存儲了多達已知魔術序列的數據庫。
我有一個Laravel 5項目,我們讓用戶下載.ai(插圖文件)。 問題是Laravel將.ai文件檢測為application / pdf。
遵循以上說明,查找魔術文件以將.ai
文件檢測為pdf即可。 因為Adobe Illustrator Artwork是可以保存為EPS或PDF格式的文件。
我幾乎沒有做過一些研究來區分一般的pdf文件和以pdf格式保存的ai文件。 首先,我已經從互聯網上下載了免費的ai文件,通過使用hexdump
和file
命令查找幻數來識別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
看一下文件的前幾個字節,正如您所看到的,它是擴展名為.ai
的PDF文件。
之后,我在Mac上使用“預覽”將其打開,它知道此文件是由Adobe Illustrator在“檢查器”對話框中創建的。 因此,它必須具有某種方法來找出以PDF格式保存的AI文件。
在線上的大多數主題都會創建自定義PHP函數或其他一些技巧來檢測mime類型,但我覺得這不是這里的正確解決方案。
在哪里可以找到最新的mime定義文件,如何將它們加載到PHP或finfo中?
我用谷歌搜索解決方案,但是沒有運氣,所以我自己創建了它,在Adobe Illustrator文件格式規范的第15頁中說:
%% Creator注釋標識了生成PostScript語言文檔的應用程序。 版本號(圖1中的6.0版)是任意文本,以換行符結尾。
我假設文件開頭包含pdf魔術字節和字符串%%Creator Adobe Illustrator
的文件應標識為.ai
。
讓我們通過編寫一些魔術規則來做到這一點:
$ 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
PHP腳本對.ai
使用自定義魔術文件
$ cat fileinfo.php
<?php
$magic_file = __DIR__ . '/ai';
$finfo = new finfo(FILEINFO_NONE, $magic_file);
echo $finfo->file($argv[1]) . PHP_EOL;
將輸出
$ php fileinfo.php ./7_full_ai_vi_template_vector_8.ai
PDF document, version 1.4 Adobe Illustrator Document
它有效,但是我認為維護自己的魔術文件不是一個好主意。 也許您可以為其編寫簡單的函數,在$type = File::mimeType( $_path );
之后檢測.ai
$type = File::mimeType( $_path );
說這是pdf文件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.