从POST数据上传文件

时间:2013-08-14 18:55:17

标签: php

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

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

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

3 个答案:

答案 0 :(得分:2)

本来是把它写成评论,但是时间太长了:

调试步骤1

首先尝试将所有条件分解为单独的if语句,以便它返回是否通过这些条件..所以,如果你有if ( ( A || B || C ) && D && E),那么为A写出** if (A) { echo "A is true" } else { "A is false" } E,然后看看你的真实价值是否符合预期。

如果你的价值观不符合预期,那你的情况就错了。

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

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

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

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

check( ($_FILES["file"]["type"] == "image/gif") );
.
.
.

答案 1 :(得分:2)

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

在您的代码中出现问题时,您当前正在将图像mime-types与一组预定义的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.";
}

希望这有帮助!

答案 2 :(得分: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";
}