PHP 基础教程
PHP 高级教程
PHP & MySQL DATABASE
PHP 示例
PHP 参考手册

PHP 上传文件

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

使用 PHP 上传文件

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

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

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

示例

Download
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>File Upload Form</title>
</head>
<body>
    <form action="upload-manager.asp" 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> Only .jpg, .jpeg, .gif, .png formats allowed to a max size of 5 MB.</p>
    </form>
</body>
</html>

注意: 除了 file-select 字段,上传表单必须使用 HTTP post 方法并且必须包含 enctype="multipart/form-data" 属性。 此属性确保表单数据被编码为多部分 MIME 数据 — 这是上传大量二进制数据(如图像、音频、视频等)所必需的。

第二步:处理上传的文件

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

示例

Download
<?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("Error: Please select a valid file format.");
    
        //验证文件大小 - 最大 5MB
        $maxsize = 5 * 1024 * 1024;
        if($filesize > $maxsize) die("Error: File size is larger than the allowed limit.");
    
        // 验证文件的 MIME 类型
        if(in_array($filetype, $allowed)){
            // 上传前检查文件是否存在
            if(file_exists("upload/" . $filename)){
                echo $filename . " is already exists.";
            } else{
                move_uploaded_file($_FILES["photo"]["tmp_name"], "upload/" . $filename);
                echo "Your file was uploaded successfully.";
            } 
        } else{
            echo "Error: There was a problem uploading your file. Please try again."; 
        }
    } else{
        echo "Error: " . $_FILES["photo"]["error"];
    }
}
?>

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

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

代码说明

提交表单后,可以通过名为 $_FILES 的 PHP 超全局数组访问有关上传文件的信息。 例如,我们的上传表单包含一个名为 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 服务器上的临时目录中。

示例

Download
<?php
if($_FILES["photo"]["error"] > 0){
    echo "Error: " . $_FILES["photo"]["error"] . "<br>";
} else{
    echo "File Name: " . $_FILES["photo"]["name"] . "<br>";
    echo "File Type: " . $_FILES["photo"]["type"] . "<br>";
    echo "File Size: " . ($_FILES["photo"]["size"] / 1024) . " KB<br>";
    echo "Stored in: " . $_FILES["photo"]["tmp_name"];
}
?>

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

Advertisements