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