0

我有一个脚本和简单的 if 检查值是否在数组中。我似乎无法找出为什么 if 标记在数组中时运行。

else if (!in_array($type, $avatarformats)) {

$error .= '<div class="alert error">You\'re image is not a allowed format</div>';

unlink($_FILES['file']['tmp_name']);

}

当脚本读取 $type 和 $avatarformats 时,它的 = 如下。

$avatarformats = Array ( [0] => .jpg [1] => .jpeg [2] => .png ) 

$type = .png

if 标记在不应该运行时运行,因为 .png 在数组中。或者我不明白我在做什么。

4

3 回答 3

2

我不确定您是如何确定类型的,但通常['type']来自$_FILES内容类型(例如'image/jpeg'),而不是文件名本身的扩展名。

要测试文件扩展名,您可以使用以下代码:

// get file extension (without leading period)
$ext = pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION);

// ...
elseif (!in_array($ext, array('png', 'jpg', 'jpeg'))) {
    // error
}
于 2012-11-01T03:14:35.023 回答
0

注意:使用exif_imagetype(),请阅读http://www.php.net/manual/en/function.exif-imagetype.php

function image_allowed($imgfile) {
  $types = array(IMAGETYPE_JPEG, IMAGETYPE_PNG);
  return in_array(exif_imagetype($imgfile), $types);
}

然后在你的代码中。

else if (!image_allowed($_FILES['file']['tmp_name'])) {

$error .= '<div class="alert error">You\'re image is not a allowed format</div>';

unlink($_FILES['file']['tmp_name']);

}
于 2012-11-01T03:27:21.150 回答
-2

我怀疑这正在返回 true,因为由于句号,in_array()该语句正在评估为 true。由于小数位,!in_array($type, $avatarformats)它正在将 的值评估为整数。$type

话虽如此,您有 2 个选项: 1)尝试从文件扩展名中剥离点,即“.png”到“png”,然后首先将其添加到数组中,然后进行测试。2)或将您的条件更改为以下内容:else if (in_array($type, $avatarformats) == false) {

in_array()是一种奇怪的野兽,我尽量避免它。isset() 是您的朋友,无论如何在大多数情况下都比 in_array 快得多。

于 2012-11-01T03:15:49.033 回答