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

PHP 檔案上傳、下載與刪除完整實作教學

     編輯:PHP 綜合知識

前言

在 Web 開發中,檔案管理是核心功能之一。本文將完整說明如何使用 PHP 實作檔案的上傳、下載與刪除功能,包含前端介面、後端邏輯、錯誤處理與安全性考量,並提供完整可執行的程式碼範例。

一、檔案上傳實作

1. 前端表單設計

建立上傳區塊與顯示區塊,表單需設定 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>

2. 後端接收與驗證

使用 $_FILES 超全域變數接收檔案,必須檢查錯誤代碼:

  • UPLOAD_ERR_INI_SIZE (1):超過 php.ini 的 upload_max_filesize
  • UPLOAD_ERR_FORM_SIZE (2):超過表單 MAX_FILE_SIZE 限制
  • UPLOAD_ERR_PARTIAL (3):檔案僅部分上傳
  • UPLOAD_ERR_NO_FILE (4):未選擇檔案
  • UPLOAD_ERR_NO_TMP_DIR (6):找不到暫存目錄
  • UPLOAD_ERR_CANT_WRITE (7):檔案寫入失敗

3. 檔案移動與儲存

使用 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、表單、Nginx/Apache 三層限制
  • 檔名重命名:避免中文檔名編碼問題與覆蓋風險

結語

本文提供了完整的 PHP 檔案管理實作範例,涵蓋上傳、下載、刪除全流程。實際部署時請根據業務需求加強安全性驗證,如加入 CSRF Token、權限檢查、病毒掃描等防護機制。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved