首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 文件上傳完整實戰:表單構建、安全驗證、移動存儲與錯誤處理

     編輯:PHP 綜合知識

前言

文件上傳是 Web 開發高頻需求,涉及前端表單、$_FILES 超全局變量、安全驗證、臨時文件移動等多個環節。本文通過 3 個 Demo 構建完整上傳流程。

一、前端表單(Demo1)

<form enctype="multipart/form-data" action="Demo2.php" method="post">
    <input type="hidden" name="MAX_FILE_SIZE" value="2000000" />
    上傳文件: <input type="file" name="userfile" />
    <input type="submit" value="上傳" />
</form>

關鍵點:enctype="multipart/form-data" 必須設置;隱藏域 MAX_FILE_SIZE 為客戶端提示(瀏覽器不強制執行)。

二、後端核心處理(Demo2)

1. $_FILES 結構解析

Array
(
    [userfile] => Array
        (
            [name]     => 原始文件名
            [type]     => MIME類型 (如 image/jpeg)
            [tmp_name] => 臨時存儲路徑 (如 C:\Windows\Temp\phpXXXX.tmp)
            [error]    => 錯誤碼 (0=成功)
            [size]     => 文件大小(字節)
        )
)

2. 分層驗證邏輯

// 允許的 MIME 類型
$allowedMimes = ['image/jpeg','image/pjpeg','image/gif','image/png','image/x-png'];

// 1. 類型驗證
if (!in_array($_FILES['userfile']['type'], $allowedMimes)) {
    exit('只允許 jpg/png/gif 圖片');
}

// 2. 上傳錯誤碼檢查
if ($_FILES['userfile']['error'] > 0) {
    $msg = ['','超過 php.ini 上傳限制','超過表單 MAX_FILE_SIZE','部分上傳','未上傳'];
    exit($msg[$_FILES['userfile']['error']]);
}

// 3. 文件大小限制 (2MB)
if ($_FILES['userfile']['size'] > 2000000) {
    exit('文件不得超過 2MB');
}

// 4. 臨時文件存在性驗證
if (!is_uploaded_file($_FILES['userfile']['tmp_name'])) {
    exit('臨時文件不存在');
}

3. 目錄準備與移動存儲

$uploadDir = __DIR__ . '/uploads';
if (!is_dir($uploadDir)) {
    mkdir($uploadDir, 0777, true);
}

$dest = $uploadDir . '/' . $_FILES['userfile']['name'];
if (!move_uploaded_file($_FILES['userfile']['tmp_name'], $dest)) {
    exit('移動失敗,請檢查目錄權限');
}

// 成功跳轉顯示
header("Location: Demo3.php?url=" . urlencode($_FILES['userfile']['name']));

三、顯示上傳結果(Demo3)

$url = $_GET['url'];
echo "<img src='uploads/" . htmlspecialchars($url) . "'/>";

四、安全加固清單(生產環境必做)

  1. 二次驗證文件類型:使用 finfo_file() 檢測真實 MIME,防偽裝。
  2. 重命名文件:uniqid().'.'.pathinfo($name, PATHINFO_EXTENSION),防覆蓋與路徑遍歷。
  3. 存儲目錄不可執行:Nginx/Apache 配置 location /uploads { php_flag engine off; }。
  4. 限制上傳頻率:結合 Redis 限制單用戶每分鐘上傳次數。
  5. 病毒掃描:集成 ClamAV 或云端安全 API。

五、常見錯誤碼速查

錯誤碼常量含義
1UPLOAD_ERR_INI_SIZE超過 php.ini upload_max_filesize
2UPLOAD_ERR_FORM_SIZE超過表單 MAX_FILE_SIZE
3UPLOAD_ERR_PARTIAL部分上傳
4UPLOAD_ERR_NO_FILE未選擇文件
6UPLOAD_ERR_NO_TMP_DIR缺少臨時目錄
7UPLOAD_ERR_CANT_WRITE寫入失敗
8UPLOAD_ERR_EXTENSION擴展中斷上傳
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved