將表單與處理邏輯合於單文件,涵蓋錯誤碼判斷、類型/大小驗證、HTTP 上傳檢查、唯一文件名生成、目錄自動創建、移動保存全流程。
<form action="upload.php" method="post" enctype="multipart/form-data">
請選擇要上傳的文件: <input type="file" name="myfile"/><br/><br/>
<input type="submit" value="submit" />
<input type="hidden" name="MAX_FILE_SIZE" value="5982"/>
</form>
enctype="multipart/form-data" 必須設置。隱藏域 MAX_FILE_SIZE 為瀏覽器端輔助限制(不可靠,服務端必須再驗證)。
<?php
if (!empty($_FILES)) {
header('Content-Type: text/html; charset=utf-8');
$file = $_FILES['myfile'];
// 1. 上傳錯誤碼檢查
if ($file['error'] > 0) {
$msg = [
1 => '超過 php.ini upload_max_filesize',
2 => '超過表單 MAX_FILE_SIZE',
3 => '文件部分上傳',
4 => '未選擇文件',
6 => '找不到臨時目錄',
7 => '寫入失敗',
8 => '擴展中斷上傳',
];
exit($msg[$file['error']] ?? '未知錯誤');
}
// 2. 擴展名白名單
$ext = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION));
$allow = ['txt','html','png','gif','jpeg','jpg'];
if (!in_array($ext, $allow)) exit('文件類型不允許');
// 3. 大小限制(2MB)
if ($file['size'] > 2*1024*1024) exit('文件過大');
// 4. 確認 HTTP POST 上傳
if (!is_uploaded_file($file['tmp_name'])) exit('非法上傳方式');
// 5. 唯一文件名:md5(uniqid(microtime(true), true)) + 擴展名
$newName = md5(uniqid(microtime(true), true)) . '.' . $ext;
// 6. 目標目錄自動創建
$dir = 'uploads';
if (!file_exists($dir)) {
mkdir($dir, 0777, true);
chmod($dir, 0777);
}
$dest = $dir . '/' . $newName;
// 7. 移動文件
if (!move_uploaded_file($file['tmp_name'], $dest)) {
exit('文件保存失敗');
}
echo '上傳成功,保存為:' . $newName;
}
?>
finfo_file 檢測 MIME 類型。php_flag engine off)。php.ini 設定 upload_max_filesize、post_max_size 並與代碼一致。move_uploaded_file 失敗:檢查目錄權限、磁盤空間、open_basedir 限制。max_execution_time、memory_limit、post_max_size。