PHP - 檔案上傳

你好,有抱負的PHP開發者們!今天,我們將要進入使用PHP進行檔案上傳的精彩世界。作為你們親切友善的電腦老師,我會帶領你們一步步走過這個旅程。所以,拿起你們最喜歡的飲料,放鬆心情,讓我們一起踏上這次檔案上傳的冒險吧!

PHP - File Uploading

了解檔案上傳

在我們投入程式碼之前,讓我們先來了解什麼是檔案上傳。想像你正在給朋友寄一封信。你寫信,將它放入信封,然後通過郵政服務寄出。檔案上傳與此非常相似!不過你傳送的不是信件,而是從你的電腦傳送一個檔案(如圖片或文件)到網頁伺服器。

創建檔案上傳表單

在我們的檔案上傳旅程中,第一步是創建一個HTML表單,讓用戶選擇並上傳檔案。將這個表單想像成我們用來寄信的信封。

讓我們創建一個簡單的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>

讓我們分解一下:

  1. action="upload.php": 這告訴表單要將數據發送到哪裡。在這個例子中,我們將創建一個名為 upload.php 的PHP腳本來處理檔案上傳。
  2. method="post": 這指定我們使用POST方法發送數據。
  3. enctype="multipart/form-data": 這非常關鍵!它告訴表單我們不僅僅是發送文字——我們還在發送一個檔案。
  4. <input type="file">: 這創建一個按鈕,讓用戶從他們的電腦中選擇一個檔案。

創建上傳腳本

現在我們有了表單,我們需要創建一個PHP腳本来處理檔案上傳。這就是魔術發生的地方!

讓我們創建我們的 upload.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 (file_exists($target_file)) {
echo "對不起,檔案已存在。";
$uploadOk = 0;
}

// 檢查檔案大小
if ($_FILES["fileToUpload"]["size"] > 500000) {
echo "對不起,你的檔案太大。";
$uploadOk = 0;
}

// 允許某些檔案格式
if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg"
&& $imageFileType != "gif" ) {
echo "對不起,只允許JPG、JPEG、PNG & GIF檔案格式。";
$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. 首先,我們檢查表單是否已經被提交,使用 isset($_POST["submit"])
  2. 我們設置一些變量:
  • $target_dir: 我們將存儲上傳檔案的目錄。
  • $target_file: 上傳檔案的全路径。
  • $uploadOk: 一個標誌,用來跟蹤是否可以上傳檔案。
  • $imageFileType: 上傳檔案的副檔名。
  1. 我們進行一些檢查:
  • 檔案是否已在我們的上傳目錄中?
  • 檔案是否太大?
  • 檔案類型是否允許?
  1. 如果這些檢查中的任何一個失敗,我們將 $uploadOk 設為 0。

  2. 最後,如果一切正常 ($uploadOk == 1),我們使用 move_uploaded_file() 函數將上傳的檔案從它的臨時位置移動到我們的上傳目錄。

常用的檔案上傳方法

這裡是一個PHP檔案上傳中常用的方法表格:

方法 描述
$_FILES["file"]["name"] 客戶端機器上原始的檔案名稱
$_FILES["file"]["type"] 檔案的MIME類型
$_FILES["file"]["size"] 檔案的大小,以位元組為單位
$_FILES["file"]["tmp_name"] 存储在伺服器上的檔案的臨時文件名
$_FILES["file"]["error"] 這個檔案上傳的錯誤代碼
move_uploaded_file() 將上傳的檔案移動到新位置

結論

好了,各位!我們已經創建了一個表單,讓用戶選擇檔案,並且一個PHP腳本來處理上傳過程,包括錯誤檢查和檔案類型限制。

記住,如果不正確處理,檔案上傳可能會成為安全風險。總是驗證和清潔用戶輸入,限制檔案類型和大小,並將上傳的檔案存儲在一個不能直接通過網頁瀏覽器訪問的目錄中。

在我們結束這個課程時,我回想起一個學生曾經在一個用於個人頭像的網站上傳了一個1GB的視頻檔案。可想而知,對伺服器來說並不是一件好事!所以,千萬記得設置那些檔案大小限制!

繼續練習,繼續編程,最重要的是,繼續享受PHP的樂趣!下次見,快樂上傳!

Credits: Image by storyset