允许上载EPS文件-两个EPS文件具有不同的MIME类型

时间:2019-02-15 作者:Tomas Eklund

我在尝试将EPS文件上载到WordPress媒体库时收到以下错误消息:

抱歉,出于安全原因,不允许使用此文件类型

所以我把这个片段添加到我的函数中。php

add_filter( \'upload_mimes\', function ( $mime_types ) {
    $mime_types[ \'eps\' ] = \'application/postscript\';

    return $mime_types;
} );
之后,我可以在我的开发机器(Windows 10,PHP 7.0.19)上本地上传几个不同的EPS文件。然而,在远程服务器(CentOS,PHP 7.2.15)上,我仍然会收到某些EPS文件的错误消息。

经过一些调试和故障排除,我意识到PHP版本不同,所以我在远程服务器上将PHP降级为7.0.33版本,突然我可以上传所有EPS文件。

关于问题可能是什么,有什么想法吗?PHP 7.0和7.2之间是否发生了一些变化upload_mimes 过滤器故障?

WordPress是最新版本5.0.3。

2 个回复
最合适的回答,由SO网友:Tomas Eklund 整理而成

在WordPress的最新版本中(5.0.1 通过使用PHP函数实际检查上传文件的内容,加强了文件上传的安全性finfo_file() 确定文件扩展名是否与MIME类型匹配。事实证明,这是有问题的,因为具有相同文件类型和扩展名的文件可能会产生不同的MIME类型。

在我的例子中,一个EPS文件(我们称之为one.eps) 被检测为“应用程序/postscript”,而另一个文件(我们称之为two.eps) “image/x-eps”或“application/octet-stream”,具体取决于服务器运行的PHP版本。

添加下面的PHP代码片段后,我始终能够上传文件one.eps 到WordPress媒体库,无论我使用的是什么版本的PHP。但是文件two.eps 如果服务器运行PHP 7.2或更高版本,则无法上载。

add_filter( \'upload_mimes\', function ( $mime_types ) {
    $mime_types[ \'eps\' ] = \'application/postscript\';
    return $mime_types;
} );
我绝不是EPS文件格式方面的专家,但我认为可以安全地假设该格式存在不同的变体。在不同的应用程序中打开这两个文件并检查其内容加强了这一信念:

在文本编辑器中打开文件:

  • one.eps 具有ASCII/人类可读的文件头two.eps 根据GIMP显示二进制格式:

    • one.eps 应用程序/postscripttwo.eps 根据PHP 7.0.10上的finfo\\u文件()的图像/epsf格式:

      • one.eps 应用程序/postscripttwo.eps 应用程序/八位字节流的格式符合PHP 7.3.2上的finfo\\u file():

        • one.eps 应用程序/postscripttwo.eps WordPress核心文件中的图像/x-epswp-includes/functions.php, 作用wp_check_filetype_and_ext() 您将发现以下内容:

          // fileinfo often misidentifies obscure files as one of these types
          $nonspecific_types = array(
              \'application/octet-stream\',
              \'application/encrypted\',
              \'application/CDFV2-encrypted\',
              \'application/zip\',
          );
          
          在函数的下面,有一个硬编码的异常,允许在某些情况下使用这些MIME类型。这就是为什么可以上传two.eps 在早期PHP版本上,自finfo_file() 将“应用程序/八位字节流”报告为其MIME类型,这是硬编码异常之一。

          不幸的是,WordPress中似乎没有允许相同扩展映射到不同MIME类型的机制,这(对我来说)将是最明显的解决方案。大致如下:

          add_filter( \'upload_mimes\', function ( $mime_types ) {
              $mime_types[ \'eps\' ] = array(\'application/postscript\', \'image/x-eps\');
              return $mime_types;
          } );
          
          然而,用户@birgireposted a workaround as an answer 类似的问题。

SO网友:ALPHA-ALI Moise Moustapha hyme

这是我在wordpress中上传eps或ai文件的解决方案

function custom_wp_check_filetype_and_ext($filetype_and_ext, $file, $filename) {
   if(!$filetype_and_ext[\'ext\'] || !$filetype_and_ext[\'type\'] || !$filetype_and_ext[\'proper_filename\']) {
        $extension = pathinfo($filename)[\'extension\'];
        $mime_type = mime_content_type($file);
        $allowed_ext = array(
            \'eps\' => array(\'application/postscript\', \'image/x-eps\'),
            \'ai\' => array(\'application/postscript\'),
        );
        if($allowed_ext[$extension]) {
            if(in_array($mime_type, $allowed_ext[$extension])) {
                $filetype_and_ext[\'ext\'] = $extension;
                $filetype_and_ext[\'type\'] = $mime_type;
                $filetype_and_ext[\'proper_filename\'] = $filename;
            }
        }
    }
    return $filetype_and_ext;
}

/** **/
add_filter(\'wp_check_filetype_and_ext\', \'custom_wp_check_filetype_and_ext\', 5, 5);

相关推荐

使用Apply_Filters()的要点

当我试图开发一个插件时,我试图看到其他插件也能完成我的插件将要实现的功能,然后我看到开发人员在大多数功能中使用该功能apply_filters() 我不明白为什么。下面是一个示例:public static function myFunction() { return apply_filters( \'du/class/method\' array( \'index\' => \'value\', \'index\' =&g