用 PHP 上傳多個檔案

Subodh Poudel 2023年1月30日
  1. 在 PHP 中使用 multiple 標籤,表單中 input 屬性的 name 標籤中的陣列和 move_uploaded_file() 函式上傳多個檔案
  2. PHP 使用 PDO 上傳資料庫中的多個檔案
用 PHP 上傳多個檔案

我們將通過將 input 標籤的 name 屬性指定為陣列並使用 multiple 屬性來介紹一種在 PHP 中上傳多個檔案的方法。form 標籤的 enctype 屬性值是 multipart/form-data。此方法使用 mysqli 進行資料庫連線。

我們還將介紹另一種使用 PDO 在 PHP 中上傳多個檔案的方法。我們將上傳資料夾中的檔案,然後將它們上傳到資料庫。這種方法在實現上類似於第一種方法。

在 PHP 中使用 multiple 標籤,表單中 input 屬性的 name 標籤中的陣列和 move_uploaded_file() 函式上傳多個檔案

我們可以將 input 標籤的 name 屬性指定為一個陣列來上傳多個檔案。input 標籤使用 multiple 關鍵字,讓我們在上傳時選擇多個檔案。我們可以為 enctype 屬性編寫編碼 multipart/form-data,以指定在提交表單時應如何編碼表單資料。我們可以使用 mysqli 連線到資料庫。move_uploaded_file() 函式將上傳的檔案從伺服器的臨時位置移動到所需位置。我們可以使用 INSERT SQL 語句將選定的檔案上傳到資料庫。

例如,設定與 mysqli 物件的資料庫連線並將值分配給 $db 變數。使用 POST 方法和編碼型別為 multipart/form-data 建立一個 HTML 表單以上傳檔案。將 input 標籤的 type 屬性指定為 file,將 name 屬性指定為 file[]。不要忘記在關閉 input 標籤之前寫入屬性 multiple。編寫 input 標籤以提交表單。

檢查表單是否已使用 isset() 函式提交。使用 count 函式計算上傳檔案的數量。將 $_FILES['file']['name'] 作為 count 函式的引數並將其分配給變數 $countfiles。使用 for 迴圈遍歷上傳的檔案。在迴圈內,建立一個變數 $filename 並將其分配為 $_FILES['file']['name'][$i]。在根目錄中建立一個名為 upload 的資料夾。使用 move_upload_file() 函式移動檔案。使用 $_FILES['file']['tmp_name'][$i] 作為第一個引數,它是具有臨時名稱的檔案。使用'upload/'.$filename 作為第二個引數,它是檔名和儲存上傳檔案的位置。

執行 SQL INSERT 查詢以將檔案插入資料庫。將變數 $filename 作為 idname 插入到資料庫的 fileup 表中。使用 $db 變數呼叫 query() 函式,並以 $sql 變數為引數來執行查詢。

示例程式碼:

# php 7.*
<?php
if(isset($_POST['submit'])){
    $countfiles = count($_FILES['file']['name']);
    for($i=0;$i<$countfiles;$i++){
        $filename = $_FILES['file']['name'][$i];
        $sql = "INSERT INTO fileup(id,name) VALUES ('$filename','$filename')";
        $db->query($sql);
        move_uploaded_file($_FILES['file']['tmp_name'][$i],'upload/'.$filename);
    }
}
?>
<form method='post' action='' enctype='multipart/form-data'>
<input type="file" name="file[]" id="file" multiple>
<input type='submit' name='submit' value='Upload'>
</form>
?>

輸出:

SELECT * FROM `fileup`
id name 
1 cfc.jpg 
2 hills.jpg

PHP 使用 PDO 上傳資料庫中的多個檔案

我們可以使用 PDO 在 PHP 中上傳多個檔案。我們可以使用 PDO 物件來建立到資料庫的連線。我們使用準備好的語句將檔案插入到資料庫中。此方法與第一種方法僅在資料庫連線方面有所不同。我們也可以對這種方法使用確切的 HTML 表單。我們通過在資料夾和資料庫中上傳兩個 jpg 檔案來演示此方法。

例如,使用 new 關鍵字建立 PDO 資料庫連線並將其分配給 $conn 變數。檢查表單是否已使用 isset() 函式提交。使用上面的 count 函式對檔案進行計數。然後,對 $query 變數編寫查詢以插入 idname。寫佔位符 ? 對於查詢中的值。使用 prepare() 函式準備查詢並在 $statement 變數中賦值。使用 move_uploaded_file() 函式將每個檔案移動到 uplaod 資料夾。使用 execute() 函式執行查詢。提供一個帶有 $filename$target_file 作為函式引數的陣列。

在下面的示例中,使用者上傳了兩個 jpg 檔案。首先,檔案被上傳到 upload 資料夾,然後它被上傳到資料庫。資料庫包含表 fileup,它具有列 idname。要了解有關 move_uploaded_files() 函式的更多資訊,請參閱 PHP 手冊

示例程式碼:

#php 7.x
<?php
$conn = new PDO("mysql:host=$server;dbname=$dbname","$username","$password");
$conn->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
if(isset($_POST['submit'])){
    $countfiles = count($_FILES['file']['name']);
    $query = "INSERT INTO fileup (id, name) VALUES(?,?)";
    $statement = $conn->prepare($query);
    for($i=0;$i<$countfiles;$i++){
        $filename = $_FILES['file']['name'][$i];
        $target_file = 'upload/'.$filename;
        move_uploaded_file($_FILES['file']['tmp_name'][$i],$target_file);
        $statement->execute(array($filename,$target_file));
        }
  }    
?>

輸出:

SELECT * FROM `fileup`
id name 
1 upload/cfc.jpg 
2+ upload/count.jpg 
作者: Subodh Poudel
Subodh Poudel avatar Subodh Poudel avatar

Subodh is a proactive software engineer, specialized in fintech industry and a writer who loves to express his software development learnings and set of skills through blogs and articles.

LinkedIn