【问题标题】:Find if file data is an image (php)查找文件数据是否为图像(php)
【发布时间】:2011-02-26 17:48:47
【问题描述】:

假设我在变量$data 中有一些文件数据。 我需要确定它是否是图像。 不需要损坏图像等细节。

首先想到的是通过查看幻数来获取文件 mime 类型,然后查看“image”是否属于 mime 类型。

没有这样的运气,即使我有“mime 类型的文件扩展名”脚本,我也没有可靠的方法从幻数中获取 mime。

我的下一个选择是有一个合理的图像文件幻数列表并查阅它们。 然而,找到这样的幻数相对困难(例如 gif 有不同的幻数,其中一些可能非常罕见 - 如果我没记错的话)。

一个更好的主意是一些可以做这种事情的 linux 程序。

有什么想法吗?我正在运行 RHEL 和 PHP 5.3。我有 root 访问权限 - 即可以根据需要安装东西。

- 克里斯。

【问题讨论】:

    标签: php linux image mime-types file-type


    【解决方案1】:

    最好的答案(我从弹片上校确定)是使用:

    $handle = imagecreatefromstring($data);
    

    引用 PHP 手册:

    图像资源将返回 成功。如果返回 FALSE 图像类型不受支持,数据为 不是可识别的格式,或者 图片已损坏,无法加载。

    【讨论】:

      【解决方案2】:

      标准的file 实用程序可能正是您想要的。它使用幻数表来识别文件格式:

      $ file test.jpg 
      test.jpg: JPEG image data, JFIF standard 1.01
      

      如果您不想创建临时文件,可以使用file - 并将数据通过管道传输到其标准输入中。确保注意子进程的终止,因为file 将写入其输出并在它读取足够多的流以确定格式后立即停止。

      【讨论】:

      • 我认为这是我的最佳答案。 - 提示特别有用。我过去做过这种事情,并且有正确的代码来让它工作。谢谢。
      • PHP 在 libmagic 数据库周围实现了自己的包装器 - 请参阅 FileInfo 函数。
      【解决方案3】:

      还有finfo:http://php.net/manual/en/function.finfo-open.php 这个 php.net 手册页上有很多工作代码。

      此外,您可以检查数据流的前 3 个字节,应该有识别图像文件格式的图像文件头数据。

      【讨论】:

      • 识别标题数据(第一部分称为幻数)是我的问题。
      • 假设您只查找 jpeg、gif 和 png 图像。我刚刚在十六进制编辑器中打开 png,发现 PNG 的前 4 个字节是:0x89 PNG,对于 GIF,前 3 个字节正是 GIF,jpeg 更复杂,但如果你比较几个 jpeg,你会发现 7-10 个字节总是 JFIF。我认为文件实用程序的工作方式相同。
      【解决方案4】:

      如果我是你,我会避免使用imagecreatefromstring 解决方案,如果你需要确定它是否是图像,因为这会在创建图像资源时使用额外的内存。此外,它只支持 JPEG、PNG、GIF、WBMP 和 GD2。而其他同样有效的图像格式将无效,例如。 ICO。

      我会按照建议使用finfo,或者如果您没有PECL 扩展,我会推荐file -bi image...。因为它将返回内容类型,例如。 image/png。您可以检查它是否以image/* 开头。这样您的脚本将接受任何图像格式。

      【讨论】:

      • 由于我稍后将编辑这些图像并且需要 GD 支持,因此该功能更有意义,因为我确信该图像将被支持。如果我需要支持更现实的类型,例如 ico 或 svg 等,我肯定会使用“file -bi”,如您所说。感谢您的提示。
      【解决方案5】:

      我认为标准的 getimagesize() 就足够了。
      当然它需要一个文件,这没什么大不了的。

      【讨论】:

      • 如果它不需要文件,我肯定会使用它。当然还有 imagecreatefromstring;我先试试看。
      猜你喜欢
      • 2014-11-25
      • 1970-01-01
      • 2013-03-02
      • 2011-01-12
      • 2014-03-11
      • 2017-06-11
      • 2014-01-10
      • 2015-07-15
      • 2011-01-08
      相关资源
      最近更新 更多