使用PHP管理HTML表单中的文件上传
在当今世界,文件每天都在交换,特别是通过互联网。网站将这些文件用于各种目的,如用户档案图片和用户之间的信息交流。这些文件包括图像、视频和PDF文件。
简介
在本教程中,我们将了解如何使用HTML表单和PHP将文件上传到网站。
前提条件
在开始本教程之前,请确保你有关于如何创建HTML表单和MySQL数据库的知识
由于我们将使用PHP,确保你已经安装了Xampp ,以帮助运行PHP代码。
注意:在本教程中,我们将使用Windows。
一旦安装完成,启动Xampp控制面板,通过点击下面突出显示的开始按钮激活Apache。

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

第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/
从浏览器上看,你应该有这样的东西。

第2步 - 创建处理文件上传的PHP逻辑
在我们上面创建的表单中,一旦我们点击提交按钮,似乎就会有一个动作发生。尽管我们选择上传的文件似乎已经被上传,但我们无法找到它们。
为了使这个表单将上传的文件保存在我们的首选位置,我们将创建一个PHP脚本来处理提交过程。
通常有两种处理上述情况的常见方法。
- 在表格记录上保存文件--在这种方式下,我们将文件保存在一个文件夹中,然后在数据库上保存参考。
- 直接在数据库上保存文件- 在这种方式下,我们将文件保存为二进制文件(BLOB)。然而,这种方式并不高效,特别是在要上传大文件的情况下。这是因为随着记录的增加,它将减缓数据库的访问速度。
在一个表记录上保存文件
在表记录上保存文件时,我们按照以下步骤进行。
- 创建一个数据库-> 前往
xampp控制面板并启动MySQL。点击管理员按钮,进入phpMyAdmin仪表板;这就是我们要创建数据库的地方。
.
在MySQL行上的管理按钮应该带你到你的浏览器并显示这个。
- 连接到数据库-- 本教程中我们将使用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 函数来结束连接,并在连接失败时给予我们反馈。
- 从表单中获取文件-- 当用户在我们的表单中上传文件时,我们需要获取该文件并将其存储在我们的首选位置。为了执行这个任务,在测试文件夹内添加一个新的文件夹,并将其命名为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表单中的文件上传。这是一种处理多部分表单提交的简单而有效的方法。