在php中识别文件类型的最佳方法

时间:2009-01-19 14:43:21

标签: php file-type

在php中发现文件的文件类型的最佳方法是什么?我听说浏览器可能会被欺骗,那么更好的方法是什么呢?

4 个答案:

答案 0 :(得分:11)

您可以使用finfo_file

<?php
echo finfo_file(finfo_open(FILEINFO_MIME), "foo.png");
?>

答案 1 :(得分:5)

看看“神奇数字”。文件的前几个字节通常标识它是什么类型的文件。例如,GIF的几个字节是47 49 46 38 37 61或47 49 46 38 39 61,GIF89a或GIF87a的ASCII。还有许多其他的“神奇数字”。见http://en.wikipedia.org/wiki/Magic_number_(programming)#Magic_numbers_in_files

编辑:我相信这比PHP上的MIME函数更可靠。

答案 2 :(得分:4)

我认为你的意思是finfo_file()来发现mimetype

来自php.net示例:

<?php
$finfo = finfo_open(FILEINFO_MIME); // return mime type ala mimetype extension
foreach (glob("*") as $filename) {
    echo finfo_file($finfo, $filename) . "\n";
}
finfo_close($finfo);
?>

答案 3 :(得分:3)

您无法信任浏览器返回的Content-Type。它基于文件扩展名,很容易被欺骗。

正如 stalepretzel 所提到的,猜测文件内容类型的最佳方法是使用幻数。如果您的服务器在* nix机器上运行,则可以使用此功能:

<?php

function get_file_type($file) {
  if(function_exists('shell_exec') === TRUE) {
    $dump = shell_exec(sprintf('file -bi %s', $file));
    $info = explode(';', $dump);
    return $info[0];
  }
  return FALSE;
}

?>

Usage: $file_type = get_file_type('my_file_name.ext');

PD:查看/usr/share/magic.mime以获取更多信息。