在 Web 開發中,檔案管理是核心功能之一。本文將完整說明如何使用 PHP 實作檔案的上傳、下載與刪除功能,包含前端介面、後端邏輯、錯誤處理與安全性考量,並提供完整可執行的程式碼範例。
建立上傳區塊與顯示區塊,表單需設定 enctype="multipart/form-data" 才能傳送檔案:
<div id="div1">
<form action="upLoadFile.php" method="post" enctype="multipart/form-data">
<div id="div2"><input type="text" id="show" /></div>
<div id="div3">
<span class="text">選擇檔案</span>
<input type='hidden' name='MAX_FILE_SIZE' value='100000000'>
<input type="file" id="upfile" name="file" />
</div>
<input type="submit" value="上傳" class="upload" />
</form>
</div>
使用 $_FILES 超全域變數接收檔案,必須檢查錯誤代碼:
使用 move_uploaded_file() 將檔案從暫存目錄移至指定資料夾,並建議重新命名避免衝突:
function uploadFile($name, $path) {
$file = $_FILES[$name];
// 錯誤檢查
if ($file['error'] > 0) {
$messages = [
1 => '超過 php.ini upload_max_filesize 限制',
2 => '超過表單 MAX_FILE_SIZE 限制',
3 => '檔案僅部分上傳',
4 => '未選擇檔案',
6 => '找不到暫存目錄',
7 => '檔案寫入失敗'
];
die("上傳錯誤: " . ($messages[$file['error']] ?? '未知錯誤'));
}
// 檔案大小限制 (100MB)
if ($file['size'] > 100000000) die('檔案過大');
// 產生唯一檔名
$ext = pathinfo($file['name'], PATHINFO_EXTENSION);
do {
$newName = date('YmdHis') . '.' . $ext;
} while (file_exists($path . '/' . $newName));
// 移動檔案
if (is_uploaded_file($file['tmp_name'])) {
return move_uploaded_file($file['tmp_name'], $path . '/' . $newName)
? $path . '/' . $newName : false;
}
die('非合法上傳檔案');
}
下載需設定正確的 HTTP 標頭,強制瀏覽器彈出下載視窗:
function downLoadFile($file, $rootPath) {
$fullPath = $rootPath . $file;
// 取得 MIME 類型
$info = getimagesize($fullPath);
header("Content-Type: " . $info['mime']);
// 設定下載檔名
header("Content-Disposition: attachment; filename=" . $file);
// 設定檔案大小
header("Content-Length: " . filesize($fullPath));
// 輸出檔案內容
readfile($fullPath);
}
刪除操作相對簡單,但務必驗證檔案路徑防止目錄遍歷攻擊:
$fileName = 'upload/' . basename($_GET['name']); // 使用 basename 防止路徑注入
if (file_exists($fileName) && is_file($fileName)) {
unlink($fileName);
header("Location: upFileAndDownFile.php");
}
使用 PHP 掃描上傳目錄動態生成檔案列表,搭配 CSS 與 JavaScript 實現滑鼠懸停顯示下載/刪除按鈕:
<div id="show-file">
<ul id="ul-list">
<?php
$dir = opendir('upload');
while ($file = readdir($dir)) {
if ($file == '.' || $file == '..') continue;
echo "<li><img src='upload/{$file}' width='120' height='100'>
<div><a href='deleteFile.php?name={$file}'>刪除</a></div>
<span><a href='download.php?name={$file}'>下載</a></span></li>";
}
closedir($dir);
?>
</ul>
</div>
getimagesize() 或 finfo_file() 驗證真實類型basename() 防止 ../../etc/passwd 類攻擊本文提供了完整的 PHP 檔案管理實作範例,涵蓋上傳、下載、刪除全流程。實際部署時請根據業務需求加強安全性驗證,如加入 CSRF Token、權限檢查、病毒掃描等防護機制。