如何通过PHP中的文件句柄检测MIME类型


How do I detect MIME type via a file handle in PHP?

我在5.4上,希望从我的文件句柄中检测一个mime类型。我知道我可以保存一个文件,然后通过传递字符串来使用函数,但我们希望避免使用字符串。那么,有没有一种没有任何条件的方法呢?

与其传递文件句柄或字符串,不如传递SplFileObject。使用它,您可以在不直接调用文件系统函数的情况下获得对文件的OO访问。需要路径名的函数仍然可以通过对对象调用->getRealPath()来使用。

$finfo     = new finfo(FILEINFO_MIME_TYPE); 
$mime_type = $finfo->file( $fileObject->getRealPath() );

如果您的PHP安装支持Fileinfo:

$finfo = new finfo;
$mime = $finfo->file($file, FILEINFO_MIME);
finfo_close($finfo);

其中$file将是文件的完整路径。$mime将包含它的MIME类型,例如JPG图像的"image/jpeg"或php脚本的"text/x.php"。

使用fileinfo

$fileinfo = finfo_file($finfo, $file, FILEINFO_MIME);     
finfo_close($finfo);

或者,你可以用面向对象的方法:

$finfo = new finfo();
$file = '/path/to/file/';
$fileinfo = $finfo->file($file, FILEINFO_MIME);

使用stream_get_meta_data提取uri

$mime = mime_content_type(
    stream_get_meta_data($fh)['uri']
);

其中$fh是我们的文件句柄

AFAIK文件内容字节中没有任何内容可以明确说明mime类型。你有两个选择:

  1. 检测检查字节的内容(实际上,考虑到难度和所涉及的性能影响,我不认为这是一个选项)
  2. 检测mime类型检查文件扩展名(如果存在这样的扩展名):这种方法不是防错的,但是公认的方法(IMO)。如果文件没有任何扩展名,那么您就有一个无法轻松解决的问题