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

PHP 文件上傳完整實現原始碼解析

     編輯:PHP 相關知識

前言

文件上傳是 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>

關鍵點解析

1. 表單必要屬性

  • enctype="multipart/form-data":允許傳輸二進位檔案資料。
  • method="POST":檔案上傳必須使用 POST 方法。
  • MAX_FILE_SIZE 隱藏欄位:客戶端初步限制,但不可信任,伺服器端必須再次驗證。

2. $_FILES 超全域陣列結構

鍵名說明
name用戶端原始檔名
typeMIME 型別(瀏覽器提供,不可完全信任)
tmp_name伺服器端暫存檔案路徑
error錯誤代碼(0 表示成功)
size檔案大小(位元組)

3. 安全加固建議

  • 檔案型別驗證:使用 finfo_file() 檢測真實 MIME 型別,而非依賴副檔名或 $_FILES['type']。
  • 隨機重命名:避免中文檔名編碼問題、覆蓋風險及惡意腳本執行。
  • 儲存目錄權限:上傳目錄應設為不可執行(如 Nginx/Apache 設定 php_flag engine off)。
  • 大小限制:同時在 php.ini(upload_max_filesize, post_max_size)與程式碼雙重限制。

進階擴充方向

  • 多檔案上傳(name="files[]" + 迴圈處理)
  • 分塊上傳/斷點續傳(前端 Plupload、WebUploader 等)
  • 雲端儲存整合(AWS S3、阿里云 OSS、七牛雲等)
  • 圖片自動縮圖、水印、格式轉換(GD / Imagick)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved