当需要上传多个文件时,一种常见的做法是使用多个 input type=file 标签分别上传。但使用这种方式,每个文件需要单独发送一个 HTTP 请求,会造成服务器负担过大。所以我们可以采用 PHP 实现多文件上传。
具体实现步骤如下:
- 在 HTML 表单中设置 enctype 属性
<form action="upload.php" method="POST" enctype="multipart/form-data">
需要设置 enctype 为 multipart/form-data,因为文件会以二进制方式读取和传输。
- 在 PHP 部分编写文件上传程序
//上传的文件保存目录
$target_path = "uploads/";
$errors = "";
//遍历所有文件
foreach($_FILES['file']['name'] as $key=>$name) {
//判断是否上传文件
if ($_FILES['file']['tmp_name'][$key] != "" && $_FILES['file']['error'][$key] == 0) {
//获取文件名和扩展名
$filename = basename($_FILES['file']['name'][$key]);
$ext = pathinfo($filename, PATHINFO_EXTENSION);
//生成唯一的文件名
$newname = uniqid().".".$ext;
//文件存放的完整路径
$target_file = $target_path.$newname;
//判断文件是否已经存在
if (file_exists($target_file)) {
$errors .= "文件 ".$newname." 已经存在,上传失败。<br>";
} else {
//将文件从临时目录移动到上传目录
if (move_uploaded_file($_FILES['file']['tmp_name'][$key], $target_file)) {
echo "文件上传成功:".$newname."<br>";
} else {
$errors .= "文件 ".$newname." 上传失败。<br>";
}
}
}
}
if ($errors != "") {
echo "<div>".$errors."</div>";
}
以上 PHP 代码会将上传的文件保存到指定目录。
其中 $_FILES['file']['name']、$_FILES['file']['tmp_name']、$_FILES['file']['error'] 是 PHP 预定义数组,分别表示上传的文件名、临时文件名和错误信息。在多文件上传时,这些数组的值是个数组,需要使用 foreach 循环遍历。
示例 1:上传单个文件
HTML 代码
<form action="upload.php" method="POST" enctype="multipart/form-data">
<input type="file" name="file">
<input type="submit" value="上传">
</form>
PHP 代码
//上传的文件保存目录
$target_path = "uploads/";
if ($_FILES['file']['tmp_name'] != "" && $_FILES['file']['error'] == 0) {
//获取文件名和扩展名
$filename = basename($_FILES['file']['name']);
$ext = pathinfo($filename, PATHINFO_EXTENSION);
//生成唯一的文件名
$newname = uniqid().".".$ext;
//文件存放的完整路径
$target_file = $target_path.$newname;
//将文件从临时目录移动到上传目录
if (move_uploaded_file($_FILES['file']['tmp_name'], $target_file)) {
echo "文件上传成功:".$newname;
} else {
echo "文件上传失败";
}
}
示例 2:上传多个文件
HTML 代码
<form action="upload.php" method="POST" enctype="multipart/form-data">
<input type="file" name="file[]" multiple>
<input type="submit" value="上传">
</form>
PHP 代码(同上,只是需要遍历 $_FILES['file']['name'] 数组)
//上传的文件保存目录
$target_path = "uploads/";
$errors = "";
//遍历所有文件
foreach($_FILES['file']['name'] as $key=>$name) {
//判断是否上传文件
if ($_FILES['file']['tmp_name'][$key] != "" && $_FILES['file']['error'][$key] == 0) {
//获取文件名和扩展名
$filename = basename($_FILES['file']['name'][$key]);
$ext = pathinfo($filename, PATHINFO_EXTENSION);
//生成唯一的文件名
$newname = uniqid().".".$ext;
//文件存放的完整路径
$target_file = $target_path.$newname;
//判断文件是否已经存在
if (file_exists($target_file)) {
$errors .= "文件 ".$newname." 已经存在,上传失败。<br>";
} else {
//将文件从临时目录移动到上传目录
if (move_uploaded_file($_FILES['file']['tmp_name'][$key], $target_file)) {
echo "文件上传成功:".$newname."<br>";
} else {
$errors .= "文件 ".$newname." 上传失败。<br>";
}
}
}
}
if ($errors != "") {
echo "<div>".$errors."</div>";
}
以上就是 PHP 实现一种多文件上传的方法的完整攻略。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:PHP 实现一种多文件上传的方法 - Python技术站