1

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

现在我需要处理文件,然后将其移动到它的真实位置,并且我有以下代码:

// 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.

我没有使用正则表达式来读取文件名,因为用户可以为文件命名任何东西,所以我必须读取文件数据。

有任何建议吗?

4

3 回答 3

2

您的解决方案 #2 和 #3 都已经有效。从getimagesize() 手册页

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

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

$img = getimagesize($sourceFile);
$fileExt = image_type_to_extension($img[2])
于 2009-12-12T12:20:23.860 回答
2

好吧,首先 $sourceFile 应该$_FILES['Filedata']['name']代替$_FILES['Filedata']['tmp_name']仅适用于您的第一个解决方案

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

  1. pathinfo($sourceFile, PATHINFO_EXTENSION);// 现在应该可以工作了
  2. getimagesize()返回一个常量,指示第二个索引中的图像类型
  3. 与第 2 点相同

请记住,它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()比依赖文件扩展名更好,因为扩展名可以很容易地更改。

于 2009-12-12T15:05:11.750 回答
1

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

编辑:我看到您已经在使用 getimagesize() 并且在翻译常量时遇到了麻烦。上面链接的 exif_imagetype() 页面包含所有返回的图像类型的翻译,这些图像类型也应该对 getimagesize() 有效。

于 2009-12-12T10:26:36.357 回答