0

我正在尝试创建一个允许用户将图像上传到目录的页面。页面的上传部分如下所示:

<form action="resources/includes/uploaded.php" method="post" enctype="multipart/form-data">
    <input type="file" name="file" id="file">
    <input type="text" name="description">
    <button class="newimage" type="submit">Upload</button>
</form>

我的 PHP 函数如下所示:

    $_SESSION['random'] = substr(number_format(time() * rand(),0,'',''),0,15);
    $allowedExts = array("gif", "jpeg", "jpg", "png");
    $temp = explode(".", $_FILES["file"]["name"]);
    $extension = end($temp);
    if ((($_FILES["file"]["type"] == "image/gif")
    || ($_FILES["file"]["type"] == "image/jpeg")
    || ($_FILES["file"]["type"] == "image/jpg")
    || ($_FILES["file"]["type"] == "image/pjpeg")
    || ($_FILES["file"]["type"] == "image/x-png")
    || ($_FILES["file"]["type"] == "image/png"))
    && ($_FILES["file"]["size"] < 200000000)
    && in_array($extension, $allowedExts))
      {
      if ($_FILES["file"]["error"] > 0)
        {
        }
      else
        {

        if (file_exists("../../uploads/" . $_SESSION['random']))
          {
          }
        else
          {
          move_uploaded_file($_FILES["file"]["tmp_name"],
          "../../uploads/" . $_SESSION['random']);

          }
        }
      }
    else
      {
      echo "Invalid file";
      }

      ...DATABASE QUERIES ETC.

以上导致在上传设置限制内的图像时打印“无效图像”。我不确定问题是什么,因为文件在那里,它在函数中被正确命名和引用 - 有什么想法吗?

4

3 回答 3

2

本来打算写这篇评论的,但写得太久了:

调试步骤 1

首先尝试将所有条件分解为单独的 if 语句,以便它返回是否通过或未通过这些条件.. 所以如果你已经为 A 到 Eif ( ( A || B || C ) && D && E)写出** if (A) { echo "A is true" } else { "A is false" },然后看看你的真值是否是你所期望的他们是。

如果你的价值观不是你期望的那样,那么你的情况就是错误的。

如果你的价值观是你所期望的,那么你的逻辑是错误的。

让我们知道是哪种情况,我们可以更有效地帮助您:)

**此外,您可以使用以下内容,而不是写出if (A) { echo "A is true" } else { "A is false" }A 到 E:

function check($letter, $condition)
{
    $retval = ($condition) ? "True" : "False";
    echo $letter." is ".$retval;
}

check( ($_FILES["file"]["type"] == "image/gif") );
.
.
.
于 2013-08-14T19:08:15.370 回答
2

您的代码可以通过多种方式进行改进。您当前正在根据图像的 mime 类型检查文件类型。检查输入文件是否与 mime 类型匹配并不能真正阻止任何事情。它很容易被欺骗,$_FILES['file']['mime-type'] 不应该被信任。它们仅用作提示,不应用于验证用户上传。

谈到代码中的问题,您目前正在将图像 mime 类型与一组预定义的 mime 类型进行比较。我会删除该条件语句,并getimagesize()改用:

$image = getimagesize($_FILES['image']['name']);
$mime_type = $image['mime'];

此外,您当前explode()用于提取文件名:

$temp = explode(".", $_FILES["file"]["name"]);
$extension = end($temp);

这很好,并且会按您的预期工作。但是您可以使用pathinfo()专门为此目的设计的函数。

$path = $_FILES['file']['name'];
$extension = pathinfo($path, PATHINFO_EXTENSION);

如果您的代码(未经测试),这是改进的版本:

$allowedExts = array("gif", "jpeg", "jpg", "png");
$imagesize = $_FILES["file"]["size"]; //storing size into a variable

$path = $_FILES['file']['name'];
$extension = pathinfo($path, PATHINFO_EXTENSION);

$image = getimagesize($_FILES['file']['name']);
$mime_type = $image['mime'];

if (in_array($extension, $allowedExts) && $size < 200000000) 
{
    if ($_FILES["file"]["error"] == 0) //0 means no errors
    {
        if (!file_exists("../../uploads/" . $_SESSION['random']))  
        {
            move_uploaded_file($_FILES["file"]["tmp_name"],
            "../../uploads/" . $_SESSION['random']);
        }
    }    
}

else
{
    echo "File validation failed.";
}

希望这可以帮助!

于 2013-08-14T19:46:53.830 回答
0

尝试这个

HTML

<input type="file"  name="img" />

PHP

$_width = 125;
$_height = 150;
$imageData = @getimagesize($_FILES["img"]["tmp_name"]);

if((($_FILES["img"]["type"] != "image/jpeg")&& ($_FILES["img"]["type"] != "image/png")&& ($_FILES["img"]["type"] != "image/jpg") && ($_FILES["img"]["size"] > 50000) && (($imageData[0] != $_width) && ($imageData[1] != $_height) )   ){
echo "validation not met";
}
于 2013-08-14T19:26:35.810 回答