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

PHP 文件上傳完整實現:類型限制、大小控制、安全重命名

     編輯:PHP 相關知識

PHP 文件上傳完整實現:類型限制、大小控制、安全重命名

文件上傳是 Web 開發高頻需求,但也是安全隱患高發區。本文提供一個生產可用的上傳處理腳本,涵蓋類型白名單、大小限制、錯誤碼處理、隨機重命名、移動存儲等核心環節,並解析關鍵安全點。

完整上傳處理代碼

<?php
// 配置區
$allowtype = ['gif', 'png', 'jpg'];        // 允許的副檔名
$size = 1000000;                             // 最大 1MB (字節)
$path = "./uploads";                         // 存儲目錄

// 1. 檢查上傳錯誤碼
if ($_FILES['myfile']['error'] > 0) {
    echo '上傳錯誤: ';
    switch ($_FILES['myfile']['error']) {
        case 1: die('超過 php.ini upload_max_filesize');
        case 2: die('超過表單 MAX_FILE_SIZE');
        case 3: die('文件只被部分上傳');
        case 4: die('沒有選擇文件');
        default: die('未知錯誤');
    }
}

// 2. 驗證文件類型(副檔名)
$ext = strtolower(pathinfo($_FILES['myfile']['name'], PATHINFO_EXTENSION));
if (!in_array($ext, $allowtype)) {
    die("副檔名 $ext 不在允許列表中!");
}

/* 進階:也可驗證 MIME 類型
list($maintype, $subtype) = explode('/', $_FILES['myfile']['type']);
if ($maintype === 'text') die('禁止上傳文本文件');
*/

// 3. 驗證文件大小
if ($_FILES['myfile']['size'] > $size) {
    die("文件大小超過限制 $size 字節");
}

// 4. 生成安全文件名:時間戳 + 隨機數 + 原副檔名
$filename = date("YmdHis") . rand(100, 999) . "." . $ext;

// 5. 移動文件
if (is_uploaded_file($_FILES['myfile']['tmp_name'])) {
    if (!move_uploaded_file($_FILES['myfile']['tmp_name'], $path . '/' . $filename)) {
        die('無法將文件移動到目標目錄');
    }
} else {
    die("非合法上傳文件:{$_FILES['myfile']['name']}");
}

// 6. 成功回饋
echo "文件上傳成功,保存在 $path 目錄下,大小:{$_FILES['myfile']['size']} 字節";
?>

關鍵安全點解析

  1. 錯誤碼優先檢查:$_FILES['error'] 為 0 才繼續,避免處理損壞/未上傳文件
  2. 副檔名白名單:拒絕執行腳本(.php、.jsp、.asp 等),僅允許圖片類型
  3. 大小雙重限制:php.ini upload_max_filesize + 代碼邏輯雙重保障
  4. 隨機重命名:防止同名覆蓋、路徑遍歷攻擊、腳本執行風險
  5. is_uploaded_file + move_uploaded_file:雙重驗證確保文件確實來自 HTTP 上傳
  6. 存儲目錄權限:uploads/ 目錄應設為不可執行(Nginx/Apache 配置 location ~ \.php$ { deny all; })

前端表單配合

<form action="upload.php" method="post" enctype="multipart/form-data">
  <input type="hidden" name="MAX_FILE_SIZE" value="1000000">
  <input type="file" name="myfile">
  <input type="submit" value="上傳">
</form>

常見問題排查

  • 上傳失敗無報錯:檢查 php.ini file_uploads = On、upload_tmp_dir 可寫
  • 大文件上傳中斷:調大 post_max_size、max_execution_time、max_input_time
  • 權限拒絕:確保 PHP 進程用戶對 uploads/ 有寫入權限

此腳本可直接用於項目,建議進一步封裝為類,增加圖片壓縮、水印、雲存儲對接等擴展功能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved