PHP 文件上传

在本教程中,您将学习如何使用PHP将文件上传到远程Web服务器。

用PHP上传文件

在本教程中,我们将学习如何使用简单HTML表单和PHP上传文件到远程服务器上。您可以上传任何类型的文件,例如图像,视频,ZIP文件,Microsoft Office文档,PDF,可执行文件和其他各种文件类型。

第1步:创建HTML表单以上传文件

以下示例将创建一个可用于上传文件的简单HTML表单。

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>File Upload Form</title>
</head>

    <form action="upload-manager.html" method="post" enctype="multipart/form-data">
        <h2>Upload File</h2>
        <label for="fileSelect">Filename:</label>
        <input type="file" name="photo" id="fileSelect">
        <input type="submit" name="submit" value="Upload">
        <p><strong>Note:</strong>仅允许.jpg、.jpeg、.gif、.png格式,最大大小为5 MB。</p>
    </form>

</html>

注意:除了文件选择字段外,上载表单还必须使用HTTP post方法,并且必须包含一个 enctype="multipart/form-data" 属性。此属性可确保将表单数据编码为多段MIME数据,这是上传大量二进制数据(例如图像,音频,视频等)所必需的。

第2步:处理上传的文件

下面是我们的“Upload-manager.php”文件的完整代码。 它将永久地将上传的文件存储在“upload”文件夹中,并执行一些基本的安全检查,如文件类型和文件大小,以确保用户上传正确的文件类型并在允许的限制内。

<?php
//检查表单是否已提交
if($_SERVER["REQUEST_METHOD"] == "POST"){
    // 检查文件是否上传成功
    if(isset($_FILES["photo"]) && $_FILES["photo"]["error"] == 0){
        $allowed = array("jpg" => "image/jpg", "jpeg" => "image/jpeg", "gif" => "image/gif", "png" => "image/png");
        $filename = $_FILES["photo"]["name"];
        $filetype = $_FILES["photo"]["type"];
        $filesize = $_FILES["photo"]["size"];
    
        // 验证文件扩展名
        $ext = pathinfo($filename, PATHINFO_EXTENSION);
        if(!array_key_exists($ext, $allowed)) die("错误:请选择有效的文件格式。");
    
        // 验证文件大小-最大5MB
        $maxsize = 5 * 1024 * 1024;
        if($filesize > $maxsize) die("错误:文件大小大于允许的限制。");
    
        // 验证文件的MIME类型
        if(in_array($filetype, $allowed)){
            // Check whether file exists before uploading it
            if(file_exists("upload/" . $filename)){
                echo $filename . " is already exists.";
            } else{
                move_uploaded_file($_FILES["photo"]["tmp_name"], "upload/" . $filename);
                echo "您的文件已成功上传。";
            } 
        } else{
            echo "错误:上载您的文件时出现问题。 请再试一次。"; 
        }
    } else{
        echo "Error: " . $_FILES["photo"]["error"];
    }
}
?>

注意:以上脚本可防止上传与同一文件夹中现有文件同名的文件。但是,如果您想要允许这样做,只需在文件名前面加上随机字符串或时间戳,例如$filename = time() . '_' . $_FILES["photo"]["name"];

您可能想知道这段代码是关于什么的。好吧,让我们逐一遍历此示例代码的每个部分,以更好地理解此过程。

代码的用法解释

一旦表单被提交,有关上传文件的信息就可以通过 PHP 超全局数组 $_ FILES 访问。例如,我们的上传表单包含一个名为 photo 的文件选择字段(即 name = " photo") ,如果任何用户使用这个字段上传文件,我们可以获得它的详细信息,比如名称、类型、大小、临时名称,或者在尝试上传时通过 $FILES ["photo"]关联数组发生的任何错误,如下所示:

  • $_FILES["photo"]["name"] — 此数组值指定文件的原始名称,包括文件扩展名。它不包括文件路径。

  • $_FILES["photo"]["type"]  — 此数组值指定文件的MIME类型。

  • $_FILES["photo"]["size"] — 此数组值指定文件大小,以字节为单位。

  • $_FILES["photo"]["tmp_name"] — 该数组值指定了临时名称,包括在文件上载到服务器后即分配给该文件的完整路径。

  • $_FILES["photo"]["error"] — 此数组值指定与文件上传相关的错误或状态代码,例如,如果没有错误,则为0。

以下示例中的PHP代码将仅显示上载文件的详细信息,并将其存储在Web服务器上的临时目录中。

<?php
if($_FILES["photo"]["error"] > 0){
    echo "错误: " . $_FILES["photo"]["error"] . "<br>";
} else{
    echo "文件名: " . $_FILES["photo"]["name"] . "<br>";
    echo "文件类型: " . $_FILES["photo"]["type"] . "<br>";
    echo "文件大小: " . ($_FILES["photo"]["size"] / 1024) . " KB<br>";
    echo "存储在: " . $_FILES["photo"]["tmp_name"];
}
?>

提示:成功上传文件后,该文件将自动存储在服务器上的临时目录中。 要永久存储此文件,您需要使用PHP的move_uploaded_file()函数将其从临时目录移动到永久位置。