如何在PHP中获取文件扩展名?

513

我希望获取我正在上传的图片的文件扩展名,但我只收到了一个数组。

$userfile_name = $_FILES['image']['name'];
$userfile_extn = explode(".", strtolower($_FILES['image']['name']));
有没有一种方法只获取文件扩展名?
5个回答

1320

不需要使用字符串函数。您可以使用实际设计用于您想要的内容的东西:pathinfo()

$path = $_FILES['image']['name'];
$ext = pathinfo($path, PATHINFO_EXTENSION);

$path = $_FILES['image']['name'][0]; 实际文件名在一个数组中。pathinfo 只能评估字符串。 - foureight84
11
只有当你的上传字段命名为image[]时,才是这种情况。 - ThiefMaster
2
我稍微修改了你的代码并创建了一个函数,以防有人想要使用它。以下是代码:function getFileExtension($path) { $ext = pathinfo($path, PATHINFO_EXTENSION); return $ext; } - Amir Md Amiruzzaman
3
@ThiefMaster 这只返回第一个扩展名,对于图像可能不太相关,但当有人上传一个存档文件时(例如.tar.gz),这可能很重要... - user1914292
6
我不认为那与问题相关,你应该根据自己的需要修改代码,而不是简单地复制代码并期望它能正常工作。因此,如果你希望获得存档文件而不是图像,你也应该让你的代码适用于该需求(而不是仅仅复制这个答案并期望它可以为你工作)。 - xorinzor
该方法也会返回GET参数... - Pinonirvana

67

这也可以正常工作:

$array = explode('.', $_FILES['image']['name']);
$extension = end($array);

19
“只有变量应该通过引用传递”,这是 PHP 手册中的内容。 - dader
1
这不是一个好的方法,因为end函数旨在将数组的内部指针移动到数组的末尾并返回该元素。问题在于数组是通过引用传递的,而由于您的数组是动态生成的,因此无法通过引用传递,因此会出现警告或失败,具体取决于您的PHP版本。 - SteveK
33
重要提示:对于像 /var/www/website.com/somefile 这样的路径,此方法将失败(您最好使用 pathinfo)。 - brianreavis
当你在Windows上将文件扩展名从.png更改为.jpg时,这将失败。在水下它总是一个.png。 - CodeWhisperer

37
更好的方法是使用 strrpos + substr(相对于 explode 来说更快):
$userfile_name = $_FILES['image']['name'];
$userfile_extn = substr($userfile_name, strrpos($userfile_name, '.')+1);

不过,使用mime_content_type检查文件类型是更好的方法: http://www.php.net/manual/en/function.mime-content-type.php


8
pathinfo() 更好吗?我不这么认为。 - ThiefMaster
3
比起爆炸,这个方法更好;但你说得对,启用pathinfo是更好的方式(一些共享服务器可能会禁用此功能)。 - Julien
17
重要提示:这将无法处理形如“/var/www/website.com/somefile”的路径。 - brianreavis
3
如果文件名中最后一个实际文件扩展名前面有一个'.',则此方法将失效。你会惊讶于实际上存在多个'.'的文件名。 - TARKUS
1
mime_content_type在当前的PHP版本中已被弃用。 - Parag Tyagi
显示剩余3条评论

24

你可以尝试使用这个mime类型

$image = getimagesize($_FILES['image']['tmp_name']);

$image['mime'] 返回图片的 MIME 类型。

该函数不需要 GD 库。您可以在这里找到文档。

此函数返回图像的 MIME 类型。

有些人使用$_FILES["file"]["type"],但它不可靠,因为它由浏览器而不是 PHP 给出。

您可以像 ThiefMaster 建议的那样使用 pathinfo() 来检索图像扩展名。

在对该图像进行任何操作之前,请确保在开发过程中成功上传了图像。


12

怎么样?

$ext = array_pop($userfile_extn);

9
我不建议这样做。你在依赖数组的顺序在未来几年内保持不变。这是一种懒惰的解决方案,很可能会在未来引起问题。 - Wade

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