-1

我正在尝试将图像存储在我的网站中,以便我可以轻松使用它,但我从这里找到了这个 php 代码,但我不太理解它。我刚刚开始 php,我不太清楚是什么改变和保留什么。如果你能更好地为我解释一下,我将不胜感激,谢谢。

    <?php
$allowedExts = array("jpg", "jpeg", "gif", "png");
$extension = end(explode(".", $_FILES["file"]["name"]));
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/png")
|| ($_FILES["file"]["type"] == "image/pjpeg"))
&& ($_FILES["file"]["size"] < 20000)
&& 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"];
      }
    }
  }
else
  {
  echo "Invalid file";
  }
?>
4

4 回答 4

2

我将把它分解一下:

$allowedExts = array("jpg", "jpeg", "gif", "png");

我们只允许上传 jpg、jpeg、gif 和 png 文件。这个数组包含我们允许的扩展。如果您愿意,可以在此处添加其他扩展。

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

这有几件事。首先,您需要意识到,当文件上传到 PHP 时,它会被 $_FILES 数组访问。$_FILES['file']['name'] 包含上传文件的文件名。为了从文件名中获取扩展名,名称被转换为一个带有explode的数组,将其拆分为“。” 特点。因此,如果文件名为 image.jpg,您最终会得到一个数组('image','jpg')。end() 函数获取数组的最后一个元素。所以在这个例子中你最终会得到'jpg'。

> if ((($_FILES["file"]["type"] == "image/gif") ||
> ($_FILES["file"]["type"] == "image/jpeg") || ($_FILES["file"]["type"]
> == "image/png") || ($_FILES["file"]["type"] == "image/pjpeg")) && ($_FILES["file"]["size"] < 20000) && in_array($extension,
> $allowedExts))

这只是检查文件类型是 'image/gif'、'image/jpeg'、'image/png' 或 'image/pjpeg' 之一,并且它小于 20000 字节并且文件扩展名在 $ allowedExts 数组。

假设它是以下行检查错误代码并在出现上传错误时将其打印出来:

if ($_FILES["file"]["error"] > 0)
{
echo "Return Code: " . $_FILES["file"]["error"] . "<br />";
}

如果没有错误(即 $_FILES['file']['error'] <= 0),那么它会输出有关上传的一些信息,然后检查 /uploads 目录中是否存在带有上传名称的文件:

if (file_exists("upload/" . $_FILES["file"]["name"]))

如果文件已经存在,则打印出错误。

如果该文件尚不存在,则它会从上传时放置的临时位置复制该文件,并将其移动到具有适当文件名的 /upload 目录。

于 2012-10-21T04:36:03.077 回答
1

我不确定您要删除或保留什么,但是,我可以解释代码中正在执行的操作。

此代码假定您有一个 html 块,该块定义了 type="file" 的输入,名称为="file"。

提交文件时传递给的参数存储在 $_FILES[] 中。$_FILES 有很多信息,包括文件类型、大小、错误信息。

第一行标识一个数组以供稍后使用的有效图像文件扩展名。

第一个 if 语句使用 mime 类型检查来检查传递的文件是否是有效的文件格式,检查扩展名是否有效,以及大小是否可接受。如果这不是有效的文件类型,代码将跳转到代码底部并创建错误消息。您可能希望更改可接受的文件大小。

如果有错误,则返回消息。如果没有错误,则此代码会打印有关正在上传的文件的统计信息。它提供文件名、文件类型、文件大小和文件的临时名称。

代码检查文件是否已经加载到“upload/”目录中。您可能想要更改文件的存储位置,您可以更改它以检查要存储图像的目录。

如果它发现文件已经在服务器上,它会发出警告消息并停止处理。您可能希望更改它以重命名文件并继续处理。

如果文件不在服务器上,则下一行: move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]);

将内容从临时存储位置移动到永久目录“upload/”并打印上传完成。

注意:这是上传过程的一个非常简单的版本......虽然有效。您可能想要: 1) 调整它,这样如果有人使用扩展名 .GIF、JPG 或 PNG 以及某些相机和人们用大写字母存储东西,它就不会失败。识别大写和小写的扩展名可能会很好。2)重命名旧文件或新上传的文件,如果您认为您可能想保存文件的旧副本。3)更新文件大小相当多,当前文件大小很小

于 2012-10-21T04:34:01.750 回答
1

解剖:

<?php
$allowedExts = array("jpg", "jpeg", "gif", "png");
$extension = end(explode(".", $_FILES["file"]["name"]));
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/png")
|| ($_FILES["file"]["type"] == "image/pjpeg"))

以上检查上传图片的 mime-type 是否允许


&& ($_FILES["file"]["size"] < 20000)
&& in_array($extension, $allowedExts))

指定最大大小并检查文件扩展名是否在数组 $extension 中


{

  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. ";
      }

如果upload/服务器上的文件夹中存在文件,则回显该特定文件已存在


else
  {
  move_uploaded_file($_FILES["file"]["tmp_name"],
  "upload/" . $_FILES["file"]["name"]);
  echo "Stored in: " . "upload/" . $_FILES["file"]["name"];
  }
}

如果服务器上的上传文件夹中不存在它,则将其复制到该文件夹​​中。


  }
else
  {
  echo "Invalid file";
  }

如果在步骤 1 和 2 中未通过文件类型、扩展名、大小等检查,则无效

于 2012-10-21T04:42:09.210 回答
0

我将尝试对代码进行基本分解。

$allowedExts = array("jpg", "jpeg", "gif", "png");创建一个包含允许的文件扩展名(jpg、jpeg、gif 和 png)的数组。

$extension = end(explode(".", $_FILES["file"]["name"]));将提取正在上传的文件的文件扩展名,将该值保存在变量 $extension 中。

以下块解释如下:

if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/png")
|| ($_FILES["file"]["type"] == "image/pjpeg"))
&& ($_FILES["file"]["size"] < 20000)
&& in_array($extension, $allowedExts))
  {
  if ($_FILES["file"]["error"] > 0)
    {
    echo "Return Code: " . $_FILES["file"]["error"] . "<br />";
    }

这个 if 条件检查正在上传的文件的扩展名。如果文件是 gif、jpeg 或 png 并且小于 20000 字节并且在允许的扩展名数组中找到扩展名,则条件为真。如果为假,则第二个 if 子句运行,代码将根据失败的原因打印错误。您可以在此处找到 PHP $_FILES 错误的完整列表:http ://www.php.net/manual/en/features.file-upload.errors.php 。

如果检查文件扩展名和大小的 if 子句结果为真,则执行以下代码:

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"];
      }
    }
  }

基本上,这首先使用第一个 if 子句检查所选文件是否已经存在。如果存在,则说明并结束脚本。如果它不存在,它会传输文件并说明传输成功。

绝对最后一个 else 子句else{echo "Invalid file";}看起来只是一个故障保护,如果出现非常可怕的错误,它将退出脚本。

这是一个非常简单的文件传输脚本,安全性几乎为零。如果你想使用这个脚本要非常小心,因为如果你让不受信任的用户使用它可能会导致重大问题。

我希望这是可以理解的。

于 2012-10-21T05:00:31.140 回答