用 PHP 上传多个文件

Subodh Poudel 2023年1月30日 2021年7月8日
  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 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