PHP 使用 $_FILES 处理上传的文件

这篇教程将详细介绍如何在 PHP 中使用超全局变量 $_FILES 来处理上传的文件。我们将涵盖从表单提交到服务器、检查和验证文件,以及最终保存或移动文件等所有步骤。

准备工作

在开始之前,请确保你的 PHP 环境支持文件上传功能。这可以通过检查 php.ini 配置文件中的 file_uploads 选项来实现。默认情况下,此选项被设置为开启。

表单设置

首先,你需要在 HTML 代码中创建一个上传文件的表单:

<form action="upload.php" method="post" enctype="multipart/form-data">
    Select image to upload:
    <input type="file" name="fileToUpload" id="fileToUpload">
    <input type="submit" value="Upload Image" name="submit">
</form>

在这个例子中,表单的 action 属性设置了上传文件将被发送到的 PHP 脚本的 URL。method 属性设置为 "post",而 enctype 属性则需要被设置为 "multipart/form-data",这样 PHP 才能识别出表单中包含了文件上传数据。

处理 $_FILES 变量

当用户提交表单时,PHP 会自动创建一个 $_FILES 数组来存储有关上传的文件的信息。每个文件在这个数组中都有一个条目,并且使用与 <input> 元素相同的名称作为键。

在我们的例子中,$_FILES["fileToUpload"] 将包含一个关联数组,其中包括以下信息:

  • name: 文件在用户计算机上的原始名称。
  • type: 文件的 MIME 类型。
  • tmp_name: 文件被上传到服务器时的临时存储路径。
  • error: 如果在文件上传过程中出现错误,则包含一个代码。
  • size: 上传文件的大小(以字节为单位)。

检查和验证文件

在处理文件之前,你应该检查并验证其是否符合所需的标准。例如:

$target_dir = "uploads/";
$target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);
$imageFileType = strtolower(pathinfo($target_file,PATHINFO_EXTENSION));

// Check if image file is a actual image or fake image
if(isset($_POST["submit"])) {
    $check = getimagesize($_FILES["fileToUpload"]["tmp_name"]);
    if($check !== false) {
        echo "File is an image - " . $check["mime"] . ".";
        $uploadOk = 1;
    } else {
        echo "File is not an image.";
        $uploadOk = 0;
    }
}

在这个例子中,我们首先通过使用 getimagesize() 函数检查文件是否为真实的图像。如果该函数返回一个非假值,则可以确认文件是一个图像。同时也要注意验证文件类型、大小和其他安全方面的考虑因素。

保存或移动文件

一旦你检查并验证了文件,你就可以将它保存到服务器上所需位置:

if ($uploadOk == 0) {
    echo "Sorry, your file was not uploaded.";
} else {
    if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {
        echo "The file ". htmlspecialchars( basename( $_FILES["fileToUpload"]["name"])). " has been uploaded.";
    } else {
        echo "Sorry, there was an error uploading your file.";
    }
}

在这个例子中,我们使用 move_uploaded_file() 函数将文件从临时位置移动到服务器上的最终目标位置。如果该操作成功,则会显示一条成功消息;否则,会显示一条错误消息。

结论

在这篇教程中,我们介绍了如何使用 PHP 的 $_FILES 超全局变量处理上传的文件。我们从设置 HTML 表单开始,然后继续检查和验证文件,最后将文件保存到服务器上所需位置。希望这篇教程能帮助你更好地理解如何在 PHP 中处理文件上传。