代码之家  ›  专栏  ›  技术社区  ›  Karl Johan Vallner

PHP7.2FINFO魔术文件

  •  2
  • Karl Johan Vallner  · 技术社区  · 7 年前

    我有一个Laravel5项目,让用户下载.ai(illustrator文件)。问题是Laravel将.ai文件检测为application/pdf。

    我正在使用此函数检测mime类型

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

    我也尝试过使用这种方法,但得到了相同的结果

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

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

    错误。我认为这是因为magic.mime文件的格式不正确。

    大多数在线主题都会创建一个定制的PHP函数或其他一些黑客来检测mime类型,但我觉得这似乎不是正确的解决方案。

    在哪里可以找到最新的mime定义文件,如何将它们加载到PHP或finfo中?

    Ubuntu 16.04
    PHP 7.2
    
    1 回复  |  直到 7 年前
        1
  •  7
  •   Gasol    7 年前

    我想,这一定是PHP的一个问题,只是不知道 .ai文件无效。我深入研究了finfo,我明白 插入另一个mime定义文件的路径。

    这个 fileinfo extension 魔术

    我有一个laravel5项目,让我们下载一个用户 (illustrator文件)。问题是,Laravel将.ai文件检测为 应用程序/pdf。

    按照上面的解释,找魔法文件检测就可以了 .ai Adobe Illustrator Artwork 是一个可以保存为EPS或PDF格式的文件。

    为了区分普通pdf文件和以pdf格式保存的ai文件,我做了一些研究。首先,我从网上下载了免费的人工智能文件,通过查找来识别文件 magic number 用这两个命令 hexdump 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
    

    看看文件的前几个字节,正如你所看到的,它是带有 分机。

    Inspector Dialog

    大多数在线主题都会创建一个定制的PHP函数或其他一些函数 解决方案在这里。

    Adobe Illustrator File Format Specification ,上面写着:

    %%Creator注释标识生成 PostScript语言文档。版本号(中的版本6.0 图1)是任意文本,以换行符结尾。

    %%Creator Adobe Illustrator 文件开头应标识为 艾未未先生

    让我们写一些 magic rule

    $ 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脚本使用自定义的魔术文件 艾未未先生

    $ 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 ); 说是pdf文件。

    推荐文章