PHP - $_FILES:在PHP中處理檔案上傳

親愛的PHP開發者們,大家好!今天我們將深入探討網頁開發中最令人興奮的方面之一:處理檔案上傳。作為你們親切的人工智慧計算機科學老師,我將指導你們了解PHP中$_FILES超全局變量的來龍去脈。所以,拿起你們最喜歡的飲料,放鬆身心,讓我們一起踏上這次檔案上傳的冒險之旅吧!

PHP - $_FILES

$_FILES是什麼?

在我們深入代碼之前,讓我們先來了解$_FILES究竟是什麼。在PHP中,$_FILES是一個超全局數組,包含了上傳檔案的信息。當用戶提交含有檔案輸入的表單時,PHP會自動填充這個數組,包含有關上傳檔案的詳細信息。

可以把$_FILES想像成一個神奇的盒子,它捕捉到了所有關於用戶試圖發送到你伺服器的檔案的重要信息。這就像是有個個人的助手,為你精細地組織所有檔案相關數據!

$_FILES的結構

讓我們來看看$_FILES數組的結構:

描述
name 客戶端機器上原始的檔案名稱
type 檔案的MIME類型
size 檔案的字節大小
tmp_name 存儲在伺服器上的暫時檔案名稱
error 這個檔案上傳的錯誤代碼

現在我們知道了$_FILES包含什麼,讓我們來看看一些實際的例子!

示例1:基本檔案上傳

讓我們從一個上傳單個檔案的基本例子開始。

HTML表單

<form action="upload.php" method="post" enctype="multipart/form-data">
選擇要上傳的圖片:
<input type="file" name="fileToUpload" id="fileToUpload">
<input type="submit" value="上傳圖片" name="submit">
</form>

PHP腚本(upload.php)

<?php
if(isset($_POST["submit"])) {
$target_dir = "uploads/";
$target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);

if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {
echo "檔案 " . basename( $_FILES["fileToUpload"]["name"]) . " 已經上傳成功。";
} else {
echo "很抱歉,上傳您的檔案時發生錯誤。";
}
}
?>

在這個例子中,我們做了以下幾件事情:

  1. 檢查表單是否已經提交。
  2. 定義我們上傳的目標目錄。
  3. 使用原始檔案名構建目標檔案路徑。
  4. 使用move_uploaded_file()將上傳的檔案從其暫時位置移動到我們的目標目錄。
  5. 最後,我們向用戶提供上傳成功或失敗的反饋。

記住,我親愛的學生們,在真實世界的場景中,總是要驗證和清潔上傳的檔案。我們可不希望有病毒悄悄滲入我們的伺服器!

示例2:多個檔案上傳

現在我們來升級一個等級,處理多個檔案的上傳!

HTML表單

<form action="upload_multiple.php" method="post" enctype="multipart/form-data">
選擇要上傳的圖片:
<input type="file" name="filesToUpload[]" id="filesToUpload" multiple>
<input type="submit" value="上傳圖片" name="submit">
</form>

PHP腚本(upload_multiple.php)

<?php
if(isset($_POST["submit"])) {
$target_dir = "uploads/";
$upload_success = true;

foreach($_FILES["filesToUpload"]["tmp_name"] as $key => $tmp_name) {
$target_file = $target_dir . basename($_FILES["filesToUpload"]["name"][$key]);

if (!move_uploaded_file($tmp_name, $target_file)) {
$upload_success = false;
break;
}
}

if ($upload_success) {
echo "所有檔案都已成功上傳。";
} else {
echo "很抱歉,上傳一個或多個檔案時發生錯誤。";
}
}
?>

在這個例子中,我們處理多個檔案上傳:

  1. 我們使用foreach循環遍歷每個上傳的檔案。
  2. 對於每個檔案,我們構建一個目標路徑並嘗試移動它。
  3. 如果任何檔案移動失敗,我們設置一個標誌並跳出循環。
  4. 最後,我們根據所有檔案是否成功上傳提供反饋。

專業提示:在真實世界的應用程序中,你可能想要提供更詳細的反饋,比如哪些特定檔案上傳失敗以及原因。

示例3:檔案驗證

讓我們在的上傳過程中加入一些基本的檔案驗證。我們將檢查檔案大小和類型。

HTML表單

<form action="upload_validate.php" method="post" enctype="multipart/form-data">
選擇要上傳的圖片(最大5MB,僅限JPG/PNG):
<input type="file" name="fileToUpload" id="fileToUpload">
<input type="submit" value="上傳圖片" name="submit">
</form>

PHP腚本(upload_validate.php)

<?php
if(isset($_POST["submit"])) {
$target_dir = "uploads/";
$target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);
$uploadOk = 1;
$imageFileType = strtolower(pathinfo($target_file,PATHINFO_EXTENSION));

// 檢查檔案大小
if ($_FILES["fileToUpload"]["size"] > 5000000) {
echo "很抱歉,您的檔案太大。最大尺寸為5MB。";
$uploadOk = 0;
}

// 允許某些檔案格式
if($imageFileType != "jpg" && $imageFileType != "png") {
echo "很抱歉,只允許JPG和PNG檔案。";
$uploadOk = 0;
}

// 檢查是否有錯誤
if ($uploadOk == 0) {
echo "很抱歉,您的檔案沒有被上傳。";
// 如果一切正常,嘗試上傳檔案
} else {
if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {
echo "檔案 " . basename( $_FILES["fileToUpload"]["name"]) . " 已經上傳成功。";
} else {
echo "很抱歉,上傳您的檔案時發生錯誤。";
}
}
}
?>

在這個最後的例子中,我們添加了一些重要的驗證:

  1. 我們檢查檔案大小,確保它不大於5MB。
  2. 我們驗證檔案類型,確保它是JPG或PNG。
  3. 只有在滿足這兩個條件時,我們才會進行上傳。

記住,我親愛的學生們,驗證是對抗惡意上傳的第一道防線。總要徹底驗證!

結論

好了,各位!我們一起走過了$_FILES的世界,從基本的上傳到處理多個檔案,甚至還添加了一些驗證。記住,能力越大,責任越大。總是要清潔和驗證你的上傳,千萬不要盲目信任用戶的輸入。

在我們結束時,我想起了我在教學初期的一個有趣故事。我曾經有一個學生試圖將他整個音樂庫上傳到一個簡單的圖片分享項目中。我們可以說,伺服器對此並不高興!

持續練習,保持好奇心,開心編程!並記住,在編程的世界裡,每個錯誤都是一個新的學習機會。

Credits: Image by storyset