Z
ZHANK
表单与请求

文件上传

$_FILES 处理、文件类型/大小验证、move_uploaded_file

文件上传

PHP 通过 $_FILES 超全局变量处理上传的文件。关键步骤:验证类型和大小,用 move_uploaded_file 移到目标位置。

学完本章你将: 掌握 $_FILES 处理、文件验证、move_uploaded_file。


HTML 上传表单

html
<form method="POST" enctype="multipart/form-data">
    <input type="file" name="avatar" accept="image/*">
    <button type="submit">上传</button>
</form>

⚠️ 文件上传必须设置 enctype="multipart/form-data"——忘了这个 upload 就不会发送。


PHP 处理上传

php
<?php
if ($_SERVER["REQUEST_METHOD"] === "POST") {
    $file = $_FILES["avatar"];

    // $_FILES 结构:
    // $file["name"]     — 原始文件名
    // $file["type"]     — MIME 类型
    // $file["size"]     — 文件大小(字节)
    // $file["tmp_name"] — 临时文件路径
    // $file["error"]    — 错误码(0 = 成功)

    // 检查上传是否成功
    if ($file["error"] !== UPLOAD_ERR_OK) {
        die("上传失败,错误码:" . $file["error"]);
    }

    // 验证大小(限制 2MB)
    if ($file["size"] > 2 * 1024 * 1024) {
        die("文件太大,最大 2MB");
    }

    // 验证类型
    $allowed = ["image/jpeg", "image/png", "image/gif"];
    if (!in_array($file["type"], $allowed)) {
        die("只允许 JPG/PNG/GIF 图片");
    }

    // 生成唯一文件名
    $ext = pathinfo($file["name"], PATHINFO_EXTENSION);
    $newName = uniqid("img_") . "." . $ext;
    $dest = "uploads/" . $newName;

    if (move_uploaded_file($file["tmp_name"], $dest)) {
        echo "上传成功:$dest";
    } else {
        echo "移动文件失败";
    }
}