主题
  • 默认模式
  • 浅蓝色模式
  • 淡绿色模式
  • 深夜模式

PHP 文件上传

文件上传是 PHP 中最常用的功能之一,它允许用户通过表单将文件从客户端上传到服务器端。


创建 HTML 表单

在下面的代码中,我们创建了一个 HTML 表单,包含一个文件输入字段和一个提交按钮:

<form action="upload.php" method="post" enctype="multipart/form-data">
    <input type="file" name="fileToUpload" id="fileToUpload">
    <input type="submit" value="Upload File" name="submit">
</form>
  • enctype="multipart/form-data" 是必须的,用于文件上传
  • method 必须设置为 "post"

创建 PHP 上传脚本 (upload.php)

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

// 检查文件是否已存在
if (file_exists($target_file)) {
    echo "Sorry, file already exists.";
    $uploadOk = 0;
}

// 检查文件大小 (这里限制为5MB)
if ($_FILES["fileToUpload"]["size"] > 5000000) {
    echo "Sorry, your file is too large.";
    $uploadOk = 0;
}

// 允许特定文件格式
if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg"
&& $imageFileType != "gif" ) {
    echo "Sorry, only JPG, JPEG, PNG & GIF files are allowed.";
    $uploadOk = 0;
}

// 检查 $uploadOk 是否为0
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.";
    }
}
?>

✅ 在上面的代码中,我们执行了以下操作:

  • 初始化变量:设置上传文件目录
  • 安全检查:检查文件是否已存在,检查文件大小(限制5MB),检查文件类型(只允许图片)
  • 执行上传:尝试移动临时文件到目标位置

$_FILES 数组详解

当文件上传后,PHP 会创建一个$_FILES数组,包含以下信息:

  • $_FILES["fileToUpload"]["name"] - 原始文件名
  • $_FILES["fileToUpload"]["type"] - 文件 MIME 类型
  • $_FILES["fileToUpload"]["size"] - 文件大小(字节)
  • $_FILES["fileToUpload"]["tmp_name"] - 服务器上的临时文件名
  • $_FILES["fileToUpload"]["error"] - 错误代码(0 表示无错误)

PHP 上传错误代码

以下是 PHP 中所有定义的文件上传错误代码($_FILES["file"]["error"]的可能值):

UPLOAD_ERR_OK (0)        - 文件上传成功,没有错误
UPLOAD_ERR_INI_SIZE (1)  - 文件大小超过php.ini中的upload_max_filesize限制
UPLOAD_ERR_FORM_SIZE (2) - 文件大小超过 HTML 表单中指定的 MAX_FILE_SIZE 限制
UPLOAD_ERR_PARTIAL (3)   - 文件只有部分被上传(上传过程中断)
UPLOAD_ERR_NO_FILE (4)   - 没有文件被上传(表单中没有选择文件)
UPLOAD_ERR_NO_TMP_DIR (6) - 服务器上缺少临时文件夹(PHP 4.3.10 和 PHP 5.0.3 引入)
UPLOAD_ERR_CANT_WRITE (7) - 无法将文件写入磁盘(权限问题或磁盘已满)
UPLOAD_ERR_EXTENSION (8) - PHP 扩展停止了文件上传

✅ 实际应用中的错误处理实例:

if ($_FILES['file']['error'] !== UPLOAD_ERR_OK) {
    switch ($_FILES['file']['error']) {
        case UPLOAD_ERR_INI_SIZE:
            $message = "文件超过服务器限制大小";
            break;
        case UPLOAD_ERR_FORM_SIZE:
            $message = "文件超过表单限制大小";
            break;
        case UPLOAD_ERR_PARTIAL:
            $message = "文件只有部分被上传";
            break;
        case UPLOAD_ERR_NO_FILE:
            $message = "没有文件被上传";
            break;
        case UPLOAD_ERR_NO_TMP_DIR:
            $message = "服务器缺少临时文件夹";
            break;
        case UPLOAD_ERR_CANT_WRITE:
            $message = "文件写入磁盘失败";
            break;
        case UPLOAD_ERR_EXTENSION:
            $message = "文件上传被PHP扩展阻止";
            break;
        default:
            $message = "未知上传错误";
            break;
    }
    die("上传错误: " . $message);
}


评论区 0
发表评论