无法获取图像文件扩展名

时间:2009-12-12 10:23:37

标签: php file-extension getimagesize

我正在使用Uploadify将图像上传到服务器 图像被上传,并放置在Web服务器的临时文件夹中。

现在我需要使用文件beore将它移动到它的真实位置,我有以下代码:

// Get the filepath and filename from server temp dir
$sourceFile   = $_FILES[ 'Filedata' ][ 'tmp_name' ]; // e.g. c:\server\path\tmp\php159.tmp

// Solution 1 for getting file extension
$fileExt1     = pathinfo($sourceFile, PATHINFO_EXTENSION); // <-- This only returns .tmp

// Solution 2 with getimagesize
list(,,$extension) = getimagesize($sourceFile);
$fileExt2     = $extension; // this only returns the number 2.

// Solution 3 with getimagesize
$img = getimagesize($sourceFile);
$fileExt3 = $img[2]; // this only returns the number 2.

我没有使用正则表达式来读取文件名,因为用户可能会将文件命名为任何内容,因此我必须读取文件数据。

任何人都有任何想法?

3 个答案:

答案 0 :(得分:2)

您的解决方案#2和#3都已有效。来自the getimagesize() manual page

  

返回一个包含7个元素的数组   ...
  索引2是指示图像类型的IMAGETYPE_XXX常量之一。

因此,对于.gif,这应该是整数2.要获得文件扩展名,请使用image_type_to_extension(),因为您已经在使用gd库。例如

$img = getimagesize($sourceFile);
$fileExt = image_type_to_extension($img[2])

答案 1 :(得分:2)

首先,$ sourceFile应该是$_FILES['Filedata']['name']而不是$_FILES['Filedata']['tmp_name'],而仅适用于您的第一个解决方案

现在关于您的解决方案/问题:

  1. pathinfo($sourceFile, PATHINFO_EXTENSION); //现在应该可以使用
  2. getimagesize()返回一个常量,指示第二个索引中的图像类型
  3. 与第2点相同
  4. 请注意,exif_imagetype()返回与getimagesize()的第二个索引完全相同的信息,如果您有权访问此功能,它应该会更好地执行。

    现在对于图像常数,最常见的三个是:

    • IMAGETYPE_GIF = 1
    • IMAGETYPE_JPEG = 2
    • IMAGETYPE_PNG = 3

    检查就像做这样的事情一样简单:

    switch (exif_imagetype($_FILES['Filedata']['tmp_name']))
    {
        case IMAGETYPE_GIF:
            echo 'is a GIF';
        break;
    
        case IMAGETYPE_JPEG:
            echo 'is a JPEG';
        break;
    
        case IMAGETYPE_PNG:
            echo 'is a PNG';
        break;
    
        case default:
            echo 'is something else;
        break;
    }
    

    还有一件事,最好使用getimagesize() / exif_imagetype()而不是依赖文件扩展名,因为扩展程序很容易更改。

答案 2 :(得分:1)

exif_imagetype()可以确定多种图形格式,速度快,甚至不使用GD。

  

编辑:我发现你已经在使用getimagesize()并且无法翻译常量。上面链接的exif_imagetype()页面包含了对getimagesize()也应该有效的所有返回图像类型的翻译。