PHP上传图片 - >无效的文件

时间:2013-02-28 04:17:17

标签: php file upload

我在带有lampp的archlinux上(最新版本) 我从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";
  }
?>

6 个答案:

答案 0 :(得分:1)

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

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

它会为您提供准确的图像格式。

答案 1 :(得分:0)

您的错误位于以下行。

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

必须如下。

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

如果条件如下,也会改变。

if (in_array($extension, $allowedExts))

答案 2 :(得分:0)

改变这种情况

&& in_array($extension, $allowedExts))

只有这种情况

&& $extension)

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

答案 3 :(得分:0)

我认为问题出在in_array()函数中。您已在此行中检查了扩展程序

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

现在$extension的值是 TRUE

因此,您无法在if条件中检查此$extension。而不是那样,

只需检查$extension是否 TRUE

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)

答案 4 :(得分: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>

答案 5 :(得分:0)

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

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

解决问题。