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

PHP 純後端檔案上傳系統實作筆記

     編輯:PHP 綜合知識

無 JavaScript、無正則的 PHP 檔案上傳完整範例

本系統僅使用 PHP 處理上傳、驗證、重命名、記錄日誌,適合初學者理解原生上傳流程。

前端表單(重點屬性)

<form action="upload.php" method="post" enctype="multipart/form-data">
  地圖名稱: <input type="text" name="mapname" maxlength="20"><br>
  檔案: <input type="file" name="map">
  <input type="hidden" name="MAX_FILE_SIZE" value="8000000">
  <input type="submit" value="上傳">
</form>

enctype="multipart/form-data" 為必填,才能傳送二進位檔案資料;MAX_FILE_SIZE 僅為瀏覽器端提示,實際限制仍以 php.ini 的 upload_max_filesize 為準。

後端處理流程

  1. 檔名過濾:移除 / \ < > 空白 等危險字元。
  2. 副檔名驗證:僅允許 rar, zip, w3m, w3x。
  3. 防重複上傳:以 Cookie 記錄用戶最近上傳的原始檔名。
  4. 自動重命名:若伺服器同名檔案存在,附加流水號 mapname1.ext。
  5. 移動暫存檔:move_uploaded_file() 至目標目錄。
  6. 寫入日誌:記錄時間、IP、檔名至 upload.log。

關鍵程式碼片段

<?php
$uploaddir = './map/';
$allowExt  = ['rar','zip','w3m','w3x'];

$mapname = str_replace(['/','\\',' ','<','>'], '', $_POST['mapname']);
if (ctype_digit($mapname)) exit('請輸入正確地圖名稱');

if (!is_uploaded_file($_FILES['map']['tmp_name'])) exit('無檔案或超過大小限制');

$ext = strtolower(pathinfo($_FILES['map']['name'], PATHINFO_EXTENSION));
if (!in_array($ext, $allowExt)) exit('副檔名不允許');

$filename = $mapname . '.' . $ext;
for ($i=1; file_exists($uploaddir.$filename); $i++) {
    $filename = $mapname . $i . '.' . $ext;
}

if (move_uploaded_file($_FILES['map']['tmp_name'], $uploaddir.$filename)) {
    setcookie('upload[]', $_FILES['map']['name'], time()+720, '/');
    $log = fopen('upload.log','a');
    fwrite($log, date('Ymd').'|'.date('H:i').'|'.$_SERVER['REMOTE_ADDR']."|$filename\n");
    fclose($log);
    echo '上傳成功';
} else {
    echo '上傳失敗';
}
?>

安全性補充

  • 生產環境請加入 MIME 型別二次驗證(finfo_file)。
  • 上傳目錄設定 php_flag engine off 或存放於 Web 根目錄外。
  • 限制單次上傳檔案大小與總數,防止 DoS。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved