不知道文件扩展名的情况下是否可以获取它?

11

我有一个名为94bf663a100e848fb599209af8cdc2b5.wmv的文件。我知道如果只使用名称94bf663a100e848fb599209af8cdc2b5,pathinfo将无法给出文件扩展名。我相信glob仅用于检查文件是否存在。那么,仅通过知道文件名(94bf663a100e848fb599209af8cdc2b5),是否可能获得文件扩展名?


哈哈哈哈,太棒了。我简直不敢相信你能这么快地引用它。 - Scarface
请注意,任何扩展名都是文件名的一部分:您可以有名为foofoo.barfoo.bar.tarfoo.bar.tar.gzfoo.bar.tar.gz.sig的文件,它们都指向不同的文件。(暂时忽略多重链接文件。)如果您不知道任何扩展名,实际上您并没有这个文件名。这种区别很重要,因为这就是为什么Michael和Switz(现已删除)的答案对您无效的原因。 - sarnold
4个回答

14

正如PHP glob手册页上的示例所示,glob不仅仅是检查文件是否存在,它会返回与表达式匹配的每个文件。

以下是该页面示例的修改版本,以满足您的需求:

$name = "94bf663a100e848fb599209af8cdc2b5";
$matching = glob($name . ".*");

$info = pathinfo($matching[0]);
$ext = $info['extension'];

这假设有一个(且仅有一个)文件有该名称(任何扩展名),但如果该文件可能不存在,或者可能存在多个具有相同名称和不同扩展名的文件,则应该能够修改它。


它很棒。基本上就是我想要的东西。每个文件名都是独特的,所以我认为glob会足够了。 - Scarface

1

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);

这假设扩展名与MIME类型匹配。对于.jpeg.jpg等变体会失败。它还需要某种带有文件扩展名的查找表。 - Michael Mior
fileinfo没有扩展名是无法工作的。我刚刚测试过了。$filename=/file1/file2/94bf663a100e848fb599209af8cdc2b5 - Scarface
1
fileinfo可以在文件没有扩展名甚至没有任何扩展名的情况下工作。这实际上是查找/验证文件类型的首选方式。虽然我不知道您为什么要获取扩展名,但如果是为了验证,任何不使用启发式来验证类型的东西都会对系统造成安全漏洞。 - Mamsaac
这不是用于验证的。我正在使用fileinfo进行验证,我完全同意你的观点。我没有能力使用$_FILES ['Filedata'] ['tmp_name'] 进行插入。文件只是放在一个文件夹中。 - Scarface
好的 :) 我只是想贡献一下意见以确保。 - Mamsaac
显示剩余4条评论

0

文件(二进制)的前几个字符通常会给你一些关于文件类型的提示。

试着在记事本中打开一些二进制文件(rar、zip、mp3等)来尝试它。


是的,但我正在尝试以高效的方式获取PHP扩展名。 - Scarface

0
尝试在PHP中使用filetype()mime_content_type()函数...将文件路径传递给它,它会返回文件类型。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接