如何在PHP中从路径中找到图像的扩展名?

12

PHP中是否有标准函数可以从相应的文件路径中找到图像的扩展名?

例如,如果我的图像路径类似于'/testdir/dir2/image.gif',那么该函数应该返回'gif'。

谢谢

9个回答

54
$ext = pathinfo(
    parse_url('/testdir/dir2/image.gif?foo=bar', PHP_URL_PATH), 
    PATHINFO_EXTENSION
); //$ext will be gif

1
我有一个hello.jpg文件,但我把它重命名为hello.gif并上传了它,这样你得到的是扩展名而不是正确的类型。在我看来,Pekka的方法更好。 - DrColossos
2
原始问题仅要求查找扩展名,无需进行安全检查或其他操作。 - fabrik
@DrColossos 但这正是原始帖所要求的-扩展名。与其将图像重命名为错误的扩展名,原始帖更有可能需要同样的代码以备将来使用。 - zaf
我并没有说他的答案不正确,只是试图解释一下可能导致负评的原因。 - DrColossos
这并不排除查询参数。 - Amir
显示剩余2条评论

15

通常更加理想的是通过图像内容而不是扩展名来检测实际图像类型。为此,请使用getimagesize()


1
这应该是正确的答案。名称的扩展名可以是任何东西。 - Nish

6

我遇到了一个问题,涉及第一个答案和包含锚点的url,例如google.com/image.jpg#anchor。

更好的解决方法:

$filename_from_url = parse_url($url);
$ext = pathinfo($filename_from_url['path'], PATHINFO_EXTENSION);

4
我认为最正确的方法是使用echo exif_imagetype函数:
   exif_imagetype("/testdir/dir2/image.gif");

   function get_image_type($image_path){

        $extension  = array(IMAGETYPE_GIF => "gif",
        IMAGETYPE_JPEG => "jpeg",
        IMAGETYPE_PNG => "png",
        IMAGETYPE_SWF => "swf",
        IMAGETYPE_PSD => "psd",
        IMAGETYPE_BMP => "bmp",
        IMAGETYPE_TIFF_II => "tiff",
        IMAGETYPE_TIFF_MM => "tiff",
        IMAGETYPE_JPC => "jpc",
        IMAGETYPE_JP2 => "jp2",
        IMAGETYPE_JPX => "jpx",
        IMAGETYPE_JB2 => "jb2",
        IMAGETYPE_SWC => "swc",
        IMAGETYPE_IFF => "iff",
        IMAGETYPE_WBMP => "wbmp",
        IMAGETYPE_XBM => "xbm",
        IMAGETYPE_ICO => "ico");

        return $extension[exif_imagetype($image_path)];
}

1
这种方法即使URL用于在服务器上编码图像也可以工作 - 做得好。 - pgee70

1

正如Shrapnel上校所提到的,有很多种方法

$path = '/some/where/img.gif';
$path = explode('.',$path);
$path = end($path);

谢谢,这段代码看起来很棒,但正如我之前所说,我只想使用一个直接的标准函数,比如'pathinfo'。 - Siva

1

我认为可以使用 strrpos()substr() 方法来简化操作

$path = "/testdir/dir2/image.gif";
$ext = substr($path, strrpos($path, '.')+1);
echo $ext; // output will be gif

更多与此问题相关的另一个问题的答案


0
我会推荐给你最完美的方式。
$file_path = '/some/where/img.gif';  
$info = new SplFileInfo($file_path);  
$file_extension = $info->getExtension(); 
var_dump($file_extension);

更多细节请查看The SplFileInfo class

希望这能对你有所帮助。

祝好!

Mudassar Ali


0

这是一个好建议,即使它与问题无关。不值得贬低。然而,将JPG转换为GIF,反之亦然,永远不会产生良好的结果。 - Pekka
1
谢谢。我知道这与问题不完全相关,尽管我想如果他要接受上传的图像,最好在发生糟糕事情之前把这一部分信息吐出来。您还可以首先检查扩展名,查看给定结果是否存在于允许扩展名数组中,然后通过GD/ImageMagick检查运行后将其保存为完全相同的扩展名。如果未找到结果,则保留默认值(例如PNG)。 - eklundchristopher

-2
基本字符串函数strrpos()substr()可以为您完成此操作。还有其他许多花式方法。

这是对一个问题的直接回答,其中OP可能想要的是彻底的文件类型检查,而不仅仅是扩展名。按照你的逻辑,这应该得到-1。只是说一下 ;) - Pekka
1
@Robus 是的。我只是在逗 @Col,因为他曾经因为直接回答明确请求而对我进行了负面评价,而实际上,这个明确的请求并不是 OP 实际需要达到最佳解决方案的。他的反馈总是有道理的(我非常重视 @Col 的知识和贡献,PHP 标签需要它),但他总是非常直接,这就是为什么当他犯同样的错误时,我会以同样的方式回应他 :) 我想指出的是,这个答案收到的负评并不是来自我。 - Pekka
@Pekka,我希望他回来抽你一顿 :P 实际上,我不确定为什么这个被踩了,最受欢迎的答案也没有检查实际类型,只是返回扩展名。它们都是在操作字符串而不是检查文件,所以不知道为什么有人讨厌这个评论。 - delete me
放松点,与 Shrapnel 上校一起 ;) - zaf
@Col. Shrapnel:我并不是说那些字符串函数不是标准的。我知道这些函数的强大之处,也知道如何使用它们,但我开启这个线程是为了了解是否有任何“直接(单一)”的标准函数来获取图像扩展名。 - Siva
显示剩余3条评论

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