Php 从POST数据上载文件

Php 从POST数据上载文件,php,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

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

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

上传
我的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>
    $_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.
$\u SESSION['random']=substr(数字格式(time()*rand(),0,,''),0,15);
$allowedExts=数组(“gif”、“jpeg”、“jpg”、“png”);
$temp=explode(“.”,$_文件[“文件”][“名称”]);
$extension=end($temp);
如果(($_文件[“文件”][“类型”]=“图像/gif”)
||($_文件[“文件”][“类型”]=“图像/jpeg”)
||($_文件[“文件”][“类型”]=“图像/jpg”)
||($_文件[“文件”][“类型”]=“图像/pjpeg”)
||($_文件[“文件”][“类型”]=“图像/x-png”)
||($_文件[“文件”][“类型”]=“图像/png”))
&&($_文件[“文件”][“大小”]<200000000)
&&in_数组($extension$allowedExts))
{
如果($\u文件[“文件”][“错误”]>0)
{
}
其他的
{
如果(文件\存在(“../../uploads/”$\会话['random']))
{
}
其他的
{
移动上传的文件($文件[“文件”][“tmp文件名”],
“../../uploads/”$_SESSION['random']);
}
}
}
其他的
{
回显“无效文件”;
}
…数据库查询等。

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

本打算将此作为注释写下来,但写得太长了:

调试步骤1

首先,尝试将所有条件分解为单独的if语句,以便返回是否通过这些条件。。因此,如果你有
if((A | | B | | | C)和&D&&E)
,然后写出**
if(A){echo“A是真的”}或者A是假的}
表示A到E,然后看看你的真值是否是你期望的值

如果你的价值观不是你所期望的,那么你的条件就是错误的

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

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

**此外,如果(A){echo“A为真”}或者{“A为假”}对于A到E,您可以使用以下命令,而不是写出

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

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

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

调试步骤1

首先,尝试将所有条件分解为单独的if语句,以便返回是否通过这些条件。。因此,如果你有
if((A | | B | | | C)和&D&&E)
,然后写出**
if(A){echo“A是真的”}或者A是假的}
表示A到E,然后看看你的真值是否是你期望的值

如果你的价值观不是你所期望的,那么你的条件就是错误的

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

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

**此外,如果(A){echo“A为真”}或者{“A为假”}
对于A到E,您可以使用以下命令,而不是写出

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

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

HTML

<input type="file"  name="img" />
试试这个

HTML

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

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

谈到代码中的问题,您当前正在将图像mime类型与预定义的mime类型集进行比较。我将删除该条件语句,改为使用:

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

$temp = explode(".", $_FILES["file"]["name"]);
$extension = end($temp);
这很好,并且会像您预期的那样工作。但您可以使用函数,它是专门为此目的而设计的

$path = $_FILES['file']['name'];
$extension = pathinfo($path, PATHINFO_EXTENSION);
如果您的代码(未经测试),以下是改进的版本:

$allowedExts=array(“gif”、“jpeg”、“jpg”、“png”);
$imagesize=$_文件[“文件”][“大小”]//将大小存储到变量中
$path=$\u文件['file']['name'];
$extension=pathinfo($path,pathinfo\u extension);
$image=getimagesize($_FILES['file']['name']);
$mime_type=$image['mime'];
if(在数组中($extension,$allowedExts)&&$size<200000000)
{
如果($_FILES[“file”][“error”]==0)//0表示没有错误
{
如果(!file_存在(“../../uploads/”$_会话['random']))
{
移动上传的文件($文件[“文件”][“tmp文件名”],
“../../uploads/”$_SESSION['random']);
}
}    
}
其他的
{
echo“文件验证失败。”;
}

希望这有帮助

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

谈到代码中的问题,您当前正在将图像mime类型与预定义的mime类型集进行比较。我将删除该条件语句,改为使用:

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

$temp = explode(".", $_FILES["file"]["name"]);
$extension = end($temp);
这很好,并且会像您预期的那样工作。但您可以使用函数,它是专门为此目的而设计的

$path = $_FILES['file']['name'];
$extension = pathinfo($path, PATHINFO_EXTENSION);
如果您的代码(未经测试),以下是改进的版本:

$allowedExts=array(“gif”、“jpeg”、“jpg”、“png”);
$imagesize=$_文件[“文件”][“大小”]//将大小存储到变量中
$path=$\u文件['file']['name'];
$extension=pathinfo($path,pathinfo\u extension);