PHP 檔案上傳

在本教程中,你將學習如何使用 PHP 將檔案上載到遠端 Web 伺服器。

使用 PHP 上傳檔案

在本教程中,我們將學習如何使用 Simple HTML 表單和 PHP 在遠端伺服器上上載檔案。你可以上傳任何型別的檔案,如影象,視訊,ZIP 檔案,Microsoft Office 文件,PDF,以及可執行檔案和各種其他檔案型別。

第 1 步:建立 HTML 表單以上傳檔案

以下示例將建立一個可用於上載檔案的簡單 HTML 表單。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>File Upload Form</title>
</head>
<body>
    <form action="upload-manager.php" method="post" enctype="multipart/form-data">
        <h2>Upload File</h2>
        <label for="fileSelect">Filename:</label>
        <input type="file" name="photo" id="fileSelect">
        <input type="submit" name="submit" value="Upload">
        <p><strong>Note:</strong> Only .jpg, .jpeg, .gif, .png formats allowed to a max size of 5 MB.</p>
    </form>
</body>
</html>

注意: 除了檔案選擇欄位外,上載表單還必須使用 post 方法,並且必須包含 enctype="multipart/form-data" 屬性。此屬性確保表單資料被編碼為多個 MIME 資料 - 這是上載大量二進位制資料(如檔案)所必需的。

第 2 步:處理上傳的檔案

這是我們的 upload-manager.php 檔案的完整程式碼。這將上傳檔案儲存在 upload 資料夾,並能實現一些基本的安全檢查,如檔案型別,檔案大小,以確保使用者上傳正確的檔案型別和允許的範圍內。

<?php
// Check if the form was submitted
if($_SERVER["REQUEST_METHOD"] == "POST"){
    // Check if file was uploaded without errors
    if(isset($_FILES["photo"]) && $_FILES["photo"]["error"] == 0){
        $allowed = array("jpg" => "image/jpg", "jpeg" => "image/jpeg", "gif" => "image/gif", "png" => "image/png");
        $filename = $_FILES["photo"]["name"];
        $filetype = $_FILES["photo"]["type"];
        $filesize = $_FILES["photo"]["size"];
    
        // Verify file extension
        $ext = pathinfo($filename, PATHINFO_EXTENSION);
        if(!array_key_exists($ext, $allowed)) die("Error: Please select a valid file format.");
    
        // Verify file size - 5MB maximum
        $maxsize = 5 * 1024 * 1024;
        if($filesize > $maxsize) die("Error: File size is larger than the allowed limit.");
    
        // Verify MYME type of the file
        if(in_array($filetype, $allowed)){
            // Check whether file exists before uploading it
            if(file_exists("upload/" . $_FILES["photo"]["name"])){
                echo $_FILES["photo"]["name"] . " is already exists.";
            } else{
                move_uploaded_file($_FILES["photo"]["tmp_name"], "upload/" . $_FILES["photo"]["name"]);
                echo "Your file was uploaded successfully.";
            } 
        } else{
            echo "Error: There was a problem uploading your file. Please try again."; 
        }
    } else{
        echo "Error: " . $_FILES["photo"]["error"];
    }
}
?>

你可能想知道這段程式碼到底是什麼。好吧,讓我們逐個瀏覽這個示例程式碼的每個部分,以便更好地理解。

程式碼說明

提交表單後,可以通過 PHP 超全域性陣列 $_FILES 訪問有關上傳檔案的資訊。例如,我們的上傳表單包含一個名為 photo(即 name="photo") 的檔案選擇欄位,如果任何使用者使用此欄位上傳檔案,我們可以獲取其詳細資訊,如名稱,型別,大小,臨時名稱或嘗試上載時發生的任何錯誤通過 $_FILES["photo"] 關聯陣列,像這樣:

  • $_FILES["photo"]["name"] - 此陣列值指定檔案的原始名稱,包括副檔名。它不包括檔案路徑。
  • $_FILES["photo"]["type"] - 此陣列值指定檔案的 MIME 型別。
  • $_FILES["photo"]["size"] - 此陣列值指定檔案大小(以位元組為單位)。
  • $_FILES["photo"]["tmp_name"] - 此陣列值指定臨時名稱,包括將檔案上載到伺服器後分配給該檔案的完整路徑。
  • $_FILES["photo"]["error"] - 此陣列值指定與檔案上載關聯的錯誤或狀態程式碼,例如,如果沒有錯誤,它將為 0。

以下示例中的 PHP 程式碼僅顯示上載檔案的詳細資訊,並將其儲存在伺服器上的臨時目錄中。

<?php
if($_FILES["photo"]["error"] > 0){
    echo "Error: " . $_FILES["photo"]["error"] . "<br>";
} else{
    echo "File Name: " . $_FILES["photo"]["name"] . "<br>";
    echo "File Type: " . $_FILES["photo"]["type"] . "<br>";
    echo "File Size: " . ($_FILES["photo"]["size"] / 1024) . " KB<br>";
    echo "Stored in: " . $_FILES["photo"]["tmp_name"];
}
?>

提示: 檔案成功上載後,會自動儲存在伺服器上的臨時目錄中。要使用此檔案或永久儲存它,你需要使用 PHP 的 move_uploaded_file() 函式將其從臨時目錄移動到永久位置。