本系統僅使用 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 為準。
/ \ < > 空白 等危險字元。rar, zip, w3m, w3x。mapname1.ext。move_uploaded_file() 至目標目錄。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 '上傳失敗';
}
?>
finfo_file)。php_flag engine off 或存放於 Web 根目錄外。