文件上傳是 Web 開發中極為常見的功能。本文提供一份完整、可直接執行的 PHP 文件上傳範例,包含前端表單與後端處理邏輯,並詳細解析關鍵步驟與安全注意事項。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>文件上傳介面</title>
</head>
<body>
<form enctype="multipart/form-data" action="upload.php" method="POST">
<input type="hidden" name="MAX_FILE_SIZE" value="1000000">
<input type="file" name="upfile" size="30">
<input type="submit" value="提交">
<input type="reset" value="重置">
</form>
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// 設定上傳目錄(請確保目錄存在且可寫入)
$uploadDir = 'd:/web/php/upload/';
$maxSize = 1024 * 1024; // 1MB
// 檢查錯誤代碼
if ($_FILES['upfile']['error'] !== UPLOAD_ERR_OK) {
die('上傳錯誤,錯誤代碼:' . $_FILES['upfile']['error']);
}
// 檢查檔案大小
if ($_FILES['upfile']['size'] > $maxSize) {
die('檔案大小超過限制(最大 1MB)');
}
// 建立目標路徑
$fileName = basename($_FILES['upfile']['name']);
$targetPath = $uploadDir . $fileName;
// 防止同名檔案覆蓋(可改為隨機命名)
if (file_exists($targetPath)) {
die('檔案已存在:' . $fileName);
}
// 移動暫存檔到目標目錄
if (move_uploaded_file($_FILES['upfile']['tmp_name'], $targetPath)) {
$size = $_FILES['upfile']['size'];
$sizeStr = $size < 1024 ? "{$size} 位元組" :
($size < 1024*1024 ? round($size/1024, 1) . " KB" :
round($size/1024/1024, 1) . " MB");
echo "<p>檔案 {$fileName} 上傳成功!</p>";
echo "<p>儲存位置:{$targetPath}</p>";
echo "<p>檔案大小:{$sizeStr}</p>";
} else {
echo '上傳失敗,請檢查目錄權限。';
}
}
?>
</body>
</html>
enctype="multipart/form-data":允許傳輸二進位檔案資料。method="POST":檔案上傳必須使用 POST 方法。MAX_FILE_SIZE 隱藏欄位:客戶端初步限制,但不可信任,伺服器端必須再次驗證。$_FILES 超全域陣列結構| 鍵名 | 說明 |
|---|---|
| name | 用戶端原始檔名 |
| type | MIME 型別(瀏覽器提供,不可完全信任) |
| tmp_name | 伺服器端暫存檔案路徑 |
| error | 錯誤代碼(0 表示成功) |
| size | 檔案大小(位元組) |
finfo_file() 檢測真實 MIME 型別,而非依賴副檔名或 $_FILES['type']。php_flag engine off)。php.ini(upload_max_filesize, post_max_size)與程式碼雙重限制。name="files[]" + 迴圈處理)