0

我在archlinux上使用lampp(最新版本)我从w3c-school学习php,我在页面上传文件,在这里我的脚本无法上传任何东西唯一返回给我的是无效文件(.jpg .png ecc ..) 这里是代码:

 <?php


include "config_db.php";

$name = "/upload/" . $_FILES['file']['name'];
$allowedExts = array("jpg", "jpeg", "gif", "png");
$extension = in_array(explode(".", $_FILES["file"]["name"]), $allowedExts);
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/png")
|| ($_FILES["file"]["type"] == "image/pjpeg"))
&& ($_FILES["file"]["size"] < 100000)
&& in_array($extension, $allowedExts))
  {
  if ($_FILES["file"]["error"] > 0)
    {
    echo "Return Code: " . $_FILES["file"]["error"] . "<br>";
    }
  else
    {
    echo "Upload: " . $_FILES["file"]["name"] . "<br>";
    echo "Type: " . $_FILES["file"]["type"] . "<br>";
    echo "Size: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
    echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br>";

    if (file_exists("upload/" . $_FILES["file"]["name"]))
      {
      echo $_FILES["file"]["name"] . " already exists. ";
      }
    else
      {
      move_uploaded_file($_FILES["file"]["tmp_name"],
      "upload/" . $_FILES["file"]["name"]);
      echo "Stored in: " . "upload/" . $_FILES["file"]["name"];
      echo '<img src="upload/' . $_FILES["file"]["name"] . '">';
      }
    }
  }
else
  {
  echo "Invalid file";
  }
?>
4

6 回答 6

1

如果图像名称包含 .(dot) 则有问题。例如,如果图像名称为 12.212.jpg,当您使用 .(点)分解图像名称时,您的扩展名将是 .212。所以在这种情况下,你需要使用下面的代码。

$name = "/upload/" . $_FILES['file']['name'];
$allowedExts = array("jpg", "jpeg", "gif", "png");
$extension = explode(".", $_FILES["file"]["name"]);
$extension = end($extension);

它将为您提供确切的图像格式。

于 2013-02-28T04:24:39.280 回答
0

我遇到了一个问题,如果扩展名是大写(即 image.JPG),它给了我无效的文件。我使用了这段代码:

$t_image = strtolower($_FILES['file']['name']);

解决问题。

于 2014-01-12T20:48:20.303 回答
0

改变这个条件

&& in_array($extension, $allowedExts))

只有这个条件

&& $extension)

因为您使用in_array了 2 次,所以不需要第 2 次。

于 2013-02-28T04:20:46.300 回答
0

我认为问题出在in_array()功能上。您已经检查了此行中的扩展名,

$extension = in_array(explode(".", $_FILES["file"]["name"]), $allowedExts);

现在$extensionvalue 是TRUE

所以你不能$extension在 if 条件下检查这个。取而代之的是,

只需检查是否$extensionTRUE

if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/png")
|| ($_FILES["file"]["type"] == "image/pjpeg"))
&& ($_FILES["file"]["size"] < 100000)
&& $extension)
于 2013-02-28T04:23:43.517 回答
0

您正在以不正确的方式检查扩展程序。应该是这样的:

$allowedExts = array("jpg", "jpeg", "gif", "png");
$extension = pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION);
header ("Content-Type: text/plain");
if ((($_FILES["file"]["type"] == "image/gif")
  || ($_FILES["file"]["type"] == "image/jpeg")
  || ($_FILES["file"]["type"] == "image/png")
  || ($_FILES["file"]["type"] == "image/pjpeg"))
  && ($_FILES["file"]["size"] < 100000)
  && in_array ($extension, $allowedExts)) echo "Success";
else echo "Error";

此代码与以下表格一起对我来说很好:

<form method="POST" enctype="multipart/form-data" action="upload.php">
  <input type="file" name="file" />
  <input type="submit" />
</form>
于 2013-02-28T04:30:46.807 回答
0

您的错误在下面一行。

$extension = in_array(explode(".", $_FILES["file"]["name"]), $allowedExts);

必须如下。

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

并且如果条件如下改变。

if (in_array($extension, $allowedExts))
于 2013-02-28T04:20:02.587 回答