簡體   English   中英

PHP 7.2 finfo魔術文件

[英]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文件,通過使用hexdumpfile命令查找幻數來識別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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM