這裡介紹如何使用網頁與 PHP 上傳檔案,並提供單檔與多檔上傳的範例程式碼。

檔案上傳是網頁設計中常用的功能,若用 PHP 開發網站的話,可以使用其 $_FILES 變數來接收從網頁上傳的檔案,以下提供 $_FILES 變數的使用方法與範例程式碼。

PHP 上傳檔案

建立一個上傳檔案用的 HTML 網頁,主要的內容如下:

<html><body>

<form method="post" enctype="multipart/form-data" action="upload.php">
  <input type="file" name="my_file">
  <input type="submit" value="Upload">
</form>

</body></html>

這個網頁表單包含了一個上傳檔案用的 <input>(其 type 設定為 "file"),再加上一個送出的按鈕。網頁表單中如果包含檔案的上傳,就要把 enctype 設定為 "multipart/form-data"

接著另外建立一個接收檔案用的 upload.php 指令稿,內容如下:

<?php
# 檢查檔案是否上傳成功
if ($_FILES['my_file']['error'] === UPLOAD_ERR_OK){
  echo '檔案名稱: ' . $_FILES['my_file']['name'] . '<br/>';
  echo '檔案類型: ' . $_FILES['my_file']['type'] . '<br/>';
  echo '檔案大小: ' . ($_FILES['my_file']['size'] / 1024) . ' KB<br/>';
  echo '暫存名稱: ' . $_FILES['my_file']['tmp_name'] . '<br/>';

  # 檢查檔案是否已經存在
  if (file_exists('upload/' . $_FILES['my_file']['name'])){
    echo '檔案已存在。<br/>';
  } else {
    $file = $_FILES['my_file']['tmp_name'];
    $dest = 'upload/' . $_FILES['my_file']['name'];

    # 將檔案移至指定位置
    move_uploaded_file($file, $dest);
  }
} else {
  echo '錯誤代碼:' . $_FILES['my_file']['error'] . '<br/>';
}
?>

在這個 PHP 程式中,會先檢查 $_FILES['my_file']['error'] 這個變數,確認檔案是否上傳成功,若成功的話其值會是 UPLOAD_ERR_OK,若失敗的話就會是其他的值,各種錯誤的值請參考 PHP 的文件

確認檔案有上傳成功之後,就可以透過 $_FILES 來取得檔案的各種資訊,這裡的 my_file 是檔案的名稱,要跟上傳網頁的 <input> 名稱對應。

檔案的內容在上傳之後,會先放置在一個暫存檔中,這個暫存檔的位置記錄在 $_FILES['my_file']['tmp_name'] 變數中,這裡我們先檢查一下該檔案是否已經存在,若沒有重複上傳的話,就把上傳的檔案放進 upload 目錄中(這個目錄請自己建立,並開啟寫入權限)。

PHP 上傳多個檔案

若要讓網頁可以一次上傳多個檔案,只要在 <input> 中加上 multiple 屬性,並將檔案名稱加上 []

<html><body>

<form method="post" enctype="multipart/form-data" action="upload.php">
  <input type="file" name="my_file[]" multiple>
  <input type="submit" value="Upload">
</form>

</body></html>

建立接收檔案的 upload.php 指令稿,檔案的處理方式跟單一檔案的狀況差不多,只是上傳多檔案時,$_FILES['my_file']['name'] 這類的變數都會變成陣列,取用時要多加上一個索引:

<?php
# 取得上傳檔案數量
$fileCount = count($_FILES['my_file']['name']);

for ($i = 0; $i < $fileCount; $i++) {
  # 檢查檔案是否上傳成功
  if ($_FILES['my_file']['error'][$i] === UPLOAD_ERR_OK){
    echo '檔案名稱: ' . $_FILES['my_file']['name'][$i] . '<br/>';
    echo '檔案類型: ' . $_FILES['my_file']['type'][$i] . '<br/>';
    echo '檔案大小: ' . ($_FILES['my_file']['size'][$i] / 1024) . ' KB<br/>';
    echo '暫存名稱: ' . $_FILES['my_file']['tmp_name'][$i] . '<br/>';

    # 檢查檔案是否已經存在
    if (file_exists('upload/' . $_FILES['my_file']['name'][$i])){
      echo '檔案已存在。<br/>';
    } else {
      $file = $_FILES['my_file']['tmp_name'][$i];
      $dest = 'upload/' . $_FILES['my_file']['name'][$i];

      # 將檔案移至指定位置
      move_uploaded_file($file, $dest);
    }
  } else {
    echo '錯誤代碼:' . $_FILES['my_file']['error'] . '<br/>';
  }
}
?>