我有一个名为94bf663a100e848fb599209af8cdc2b5.wmv的文件。我知道如果只使用名称94bf663a100e848fb599209af8cdc2b5,pathinfo
将无法给出文件扩展名。我相信glob
仅用于检查文件是否存在。那么,仅通过知道文件名(94bf663a100e848fb599209af8cdc2b5),是否可能获得文件扩展名?
我有一个名为94bf663a100e848fb599209af8cdc2b5.wmv的文件。我知道如果只使用名称94bf663a100e848fb599209af8cdc2b5,pathinfo
将无法给出文件扩展名。我相信glob
仅用于检查文件是否存在。那么,仅通过知道文件名(94bf663a100e848fb599209af8cdc2b5),是否可能获得文件扩展名?
正如PHP glob手册页上的示例所示,glob
不仅仅是检查文件是否存在,它会返回与表达式匹配的每个文件。
以下是该页面示例的修改版本,以满足您的需求:
$name = "94bf663a100e848fb599209af8cdc2b5";
$matching = glob($name . ".*");
$info = pathinfo($matching[0]);
$ext = $info['extension'];
这假设有一个(且仅有一个)文件有该名称(任何扩展名),但如果该文件可能不存在,或者可能存在多个具有相同名称和不同扩展名的文件,则应该能够修改它。
finfo_file()
函数将检查文件的字节签名以返回其MIME类型。从那里,您可以大部分推断出正确的文件扩展名。
// Adapted from the PHP docs
$finfo = finfo_open(FILEINFO_MIME_TYPE); // return mime type ala mimetype extension
echo finfo_file($finfo, $filename);
finfo_close($finfo);
.jpeg
和.jpg
等变体会失败。它还需要某种带有文件扩展名的查找表。 - Michael Mior文件(二进制)的前几个字符通常会给你一些关于文件类型的提示。
试着在记事本中打开一些二进制文件(rar、zip、mp3等)来尝试它。
filetype()
或mime_content_type()
函数...将文件路径传递给它,它会返回文件类型。
foo
、foo.bar
、foo.bar.tar
、foo.bar.tar.gz
、foo.bar.tar.gz.sig
的文件,它们都指向不同的文件。(暂时忽略多重链接文件。)如果您不知道任何扩展名,实际上您并没有这个文件名。这种区别很重要,因为这就是为什么Michael和Switz(现已删除)的答案对您无效的原因。 - sarnold