如何用PHP管理HTML表单中的文件上传

315 阅读3分钟

使用PHP管理HTML表单中的文件上传

在当今世界,文件每天都在交换,特别是通过互联网。网站将这些文件用于各种目的,如用户档案图片和用户之间的信息交流。这些文件包括图像、视频和PDF文件。

简介

在本教程中,我们将了解如何使用HTML表单和PHP将文件上传到网站。

前提条件

在开始本教程之前,请确保你有关于如何创建HTML表单和MySQL数据库的知识

由于我们将使用PHP,确保你已经安装了Xampp ,以帮助运行PHP代码。

注意:在本教程中,我们将使用Windows。

一旦安装完成,启动Xampp控制面板,通过点击下面突出显示的开始按钮激活Apache。

Apache image

几秒钟后,Apache的标题应该变成绿色背景,以表明apache服务器正在运行。请看下面的图片作为参考。

Apache running image

第1步 - 创建PHP文件

导航到C:\xampp\htdocs\ (驱动位置取决于你安装Xampp应用的位置),并创建一个新的文件夹test

我们将在test 文件夹下创建一个新的文件(index.php) ,这就是我们将为本教程编写所有代码的地方。

index.php 文件中插入以下代码。

<!DOCTYPE html>
<html lang="en">
  <head>
    <title>HTML Form</title>
  </head>
  <body>
    <h1>Form</h1>
    <form method="POST" action="index.php" enctype="multipart/form-data" >
      <label  class="form-label">Name</label>
      <input type="text" class="form-control" id="exampleInputEmail1" name="name" required > <br><br>
      file : <input type="file" name="file"><br><br>
      <br/>
      <input type="submit" value="submit"  name="submit">
    </form>
  </body>
</html>

要查看这段代码的输出,请到你的浏览器http://localhost/test。在这里,我们将我们的文件夹名称`test` 添加到我们的Apache服务器的基本URL中。http://localhost/

从浏览器上看,你应该有这样的东西。

form output

第2步 - 创建处理文件上传的PHP逻辑

在我们上面创建的表单中,一旦我们点击提交按钮,似乎就会有一个动作发生。尽管我们选择上传的文件似乎已经被上传,但我们无法找到它们。

为了使这个表单将上传的文件保存在我们的首选位置,我们将创建一个PHP脚本来处理提交过程。

通常有两种处理上述情况的常见方法。

  1. 在表格记录上保存文件--在这种方式下,我们将文件保存在一个文件夹中,然后在数据库上保存参考。
  2. 直接在数据库上保存文件- 在这种方式下,我们将文件保存为二进制文件(BLOB)。然而,这种方式并不高效,特别是在要上传大文件的情况下。这是因为随着记录的增加,它将减缓数据库的访问速度。

在一个表记录上保存文件

在表记录上保存文件时,我们按照以下步骤进行。

  1. 创建一个数据库-> 前往xampp 控制面板并启动MySQL。点击管理员按钮,进入phpMyAdmin 仪表板;这就是我们要创建数据库的地方。

mysql button.

在MySQL行上的管理按钮应该带你到你的浏览器并显示这个。

Phpmyadmin 仪表板

  1. 连接到数据库-- 本教程中我们将使用mysqli。在我们的index.php 文件中,在结束的html标签下,让我们添加以下php脚本。
<?php
$server = 'localhost';
$user = "root";
$password = "";
$dbname = "tutorial";
$conn = mysqli_connect($server, $user, $password, $dbname) or die("could not connect to the database");
?>

上面的代码允许我们连接到我们的数据库。$server 变量存储了我们数据库所在的服务器的名称。

$user$password 变量存储关于用户的数据。在我们的例子中,$password 是空的,因为在我们的Apache服务器中,我们没有设置任何变量。$dbname 存储我们的数据库名称。

我们将使用$conn 变量来连接到数据库。为了确保连接正常,我们使用die 函数来结束连接,并在连接失败时给予我们反馈。

  1. 从表单中获取文件-- 当用户在我们的表单中上传文件时,我们需要获取该文件并将其存储在我们的首选位置。为了执行这个任务,在测试文件夹内添加一个新的文件夹,并将其命名为uploads。

这段代码将从表单中获取文件。在我们的PHP脚本中插入它,就在$conn

if(isset($_POST['submit'])){
   $name = $_FILES['file']['name'];
   //the directory to upload to
   $targetDir = "uploads/";
   //the file being upload
   $targetFile = $targetDir.basename($\_FILES['file']['name']);
   //select the file type - file extension
   $fileType = strtolower(pathinfo($targetFile,PATHINFO_EXTENSION));
}

我们使用一个if语句来检查用户是否点击了提交按钮。如果为真,文件名将被存储在$name.由于我们创建了我们的首选存储位置,我们使用$targetDir 来表示将存储我们的文件。

在某些情况下,我们可能想限制上传的文件类型。不同的文件有不同的扩展名,使我们能够过滤文件。

$fileType 下面插入以下代码。

//valid file extensions we will allow
$extensions_arr= array("jpg","jpeg","png");
//checking the extension of our uploaded file
if(in_array($fileType,$extensions_arr)){
   // Insert record
   $query = " INSERT into `files` (`filename`) values('$name')";
   mysqli_query($conn,$query);
   // Upload file
   move_uploaded_file($_FILES['file']['tmp_name'],$targetDir.$name);
} else echo " wrong file type ";

在本教程中,我们将把类型限制为只有照片。$extensions_arr 存储我们将允许的文件类型。

让我们检查一下我们的文件是否有上述的扩展名。in_array 函数检查一个值是否存在于一个数组中。

如果它存在,我们将创建一个查询,将文件的名称插入我们的数据库。这作为我们文件的参考,将被存储在uploads 文件夹中。

如果文件类型与我们数组中的扩展名不匹配,我们将使用echo 函数返回一个错误信息。

检索文件

为了检索我们存储在数据库中的文件,我们需要查询数据库中的文件名。

由于我们只存储了文件名而不是文件名本身,所以查询的结果与我们uploads 文件夹中的文件相匹配。

php $sql = "SELECT `filename` FROM `files` WHERE `filename`= '$name'"; $result = mysqli_query($conn,$sql); $row = mysqli_fetch_array($result); $image = $row['filename']; $image_src = "uploads/".$image 

由于我们的文件是图像,我们将在我们的PHP脚本的关闭标签后添加一个图像标签。这段代码将显示我们在数据库中上传的图片。

php <img src='<?php echo $image_src; ?>' > 

我们的最终代码将如下所示。

<!DOCTYPE html>
<html lang="en">
  <head>
    <title>HTML Form</title>
  </head>
  <body>
    <h1>Form</h1>
    <form method="POST" action="index.php" enctype="multipart/form-data">
      <label for="exampleInputEmail1" class="form-label">Name</label>
      <input type="text" class="form-control" id="exampleInputEmail1" name="name" required aria-describedby="emailHelp"> <br><br>
      File : <input type="file" name="file"><br><br>
      <br/>
      <input type="submit" value="submit"  name= "submit">
    </form>
  </body>
</html>
<?php
  $server='localhost';
  $user= "root";
  $password ="";
  $dbname="tutorial";
  $conn= mysqli_connect($server,$user,$password, $dbname) or die ("could not connect to the database");

  if(isset($_POST['submit'])){
     $fileName = $_POST['name'];
     $name = $_FILES['file']['name'];
     $targetDir = "uploads/";
     $targetFile = $targetDir.basename($_FILES['file']['name']);
     $fileType = strtolower(pathinfo($targetFile,PATHINFO_EXTENSION));
     $extensions_arr= array("jpg","jpeg","png");
     if( in_array($fileType,$extensions_arr) ){
     // Insert record
     $query = " INSERT into `files` (`filename`) values('$name')";
     mysqli_query($conn,$query);
     // Upload file
     move_uploaded_file($_FILES['file']['tmp_name'],$targetDir.$name);
     } else echo " wrong file type ";

     }
     $sql = "SELECT  `filename` FROM `files` WHERE `filename`= '$name'";
     $result = mysqli_query($conn,$sql);
     $row = mysqli_fetch_array($result);
     $image = $row['filename'];
     $image_src = "uploads/".$image;
  ?>
<img src='<?php echo $image_src; ?>' >

结论

这就是我们如何用PHP处理HTML表单中的文件上传。这是一种处理多部分表单提交的简单而有效的方法。