1 作业完成思路
- 编写前端文件上传页面,计划用一个页面同步测试单文件和多文件上传
- 编写文件上传类,用单例模式实现文件上传类
- 编写测试页
2 类中方法逻辑
2.1 setArr方法
- 用来将多文件上传时的数组整理成为和单文件上传时一样的数组格式
- 先判断上传文件的数量
- 利用for循环取得新的数组
2.2 setsave方法
- 实现文件上传的主要方法
- 先判断是否是多文件上传,并数据进行整理
- 判断文件上传参数error中有无错误代码
- 判断文件是否合法来源
- 判断文件扩展名是否合法
- 定义新的文件名
- 将临时文件移动到指定位置
2.3 save方法
- 用来接收初始化参数,实现构造函数的作用
- 调用setsave方法存放文件
3 demo展示
3.1 前端页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>文件上传测试页</title>
<style>
*{margin: 0;padding: 0}
main{margin: 10px auto;width: 940px;}
form{width:940px;display: flex;flex-flow: row nowrap}
div{display: flex;flex-flow: column nowrap;width:300px;
height: 220px;border: 1px solid #55ce9f;align-items: center;margin:10px}
input{border: 1px solid #55ce9f;border-radius: 5px;margin: 5px}
button{margin-top: auto;width: 100px;}
</style>
</head>
<body>
<main>
<form action="fileupload.php" method="post" enctype="multipart/form-data">
<div>
<h2>单个文件上传</h2>
<input type="file" name="uploadfile" >
<button>提交</button>
</div>
<div>
<h2>多个文件上传</h2>
<input type="file" name="uploadfiles[]">
<input type="file" name="uploadfiles[]">
<input type="file" name="uploadfiles[]">
<input type="file" name="uploadfiles[]">
<button>提交</button>
</div>
<div>
<h2>单框上传多个文件</h2>
<input type="file" name="uploadfileclass[]" multiple="multiple">
<button>提交</button>
</div>
</form>
</main>
</body>
</html>
3.2 文件上传类
namespace php\demo\lib;
use php\demo\lib\MyFileUploadException;
class FileUpload
{
/*
* @paparm $fileFormName 用来存放表单空间变量名称,string类型
* @paparm $fileArr 用来存放待上传的数组 array类型
* @paparm $fileExtensionAllow 用来存放可上传的文件类型 array类型
* @paparm $flag 用来标示是否是多文件上传控件 true为多文件上传 false为单文件上传,默认值为false
* @paparm $uploadDir 用来设置文件存路径 默认值为D:\phpstudy_pro\WWW\php\demo\upload\ 需先创建文件夹
* @paparm $extension 用来存放文件扩展名,便于和可上传类型进行比对
*/
private static $fileFormName = null;
private static $fileArr = [];
private static $fileExtensionAllow = [];
private static $flag = false;
private static $uploadDir = 'D:\phpstudy_pro\WWW\php\demo\upload\\';
private static $extension;
//私有构造函数,防止实例化类
private function __construct(...$paparm)
{
}
//私有克隆函数,防止实例化类
private function __clone()
{
}
//保存文件方法
public static function save(...$paparm){
list($fileFormName, $fileExtensionAllow, $flag, $uploadDir) = $paparm;
self::$fileFormName = $fileFormName;
self::$fileExtensionAllow = $fileExtensionAllow;
if (!is_null($uploadDir))
self::$uploadDir = $uploadDir;
if (!is_null($flag))
self::$flag = $flag;
self::setSave();
}
//将多文件上传时的数组进行整理
protected static function setArray()
{
$n = count($_FILES[self::$fileFormName]['name']);
for ($i = 0; $i < $n; $i++) {
self::$fileArr[$i]['name'] = $_FILES[self::$fileFormName]['name'][$i];
self::$fileArr[$i]['type'] = $_FILES[self::$fileFormName]['type'][$i];
self::$fileArr[$i]['tmp_name'] = $_FILES[self::$fileFormName]['tmp_name'][$i];
self::$fileArr[$i]['error'] = $_FILES[self::$fileFormName]['error'][$i];
self::$fileArr[$i]['size'] = $_FILES[self::$fileFormName]['size'][$i];
}
return self::$fileArr;
}
//设置文件保存
protected static function setSave()
{
//判断是否为多文件上传
if (self::$flag)
self::$fileArr = self::setArray();
else
//为了统一多文件上传和单文件上传的数组格式,将单文件上传时的数组赋值给一个索引为0的数组
self::$fileArr[0] = $_FILES[self::$fileFormName];
echo '<pre>' . print_r(self::$fileArr, true) . '</pre>';
$i = 0;
foreach (self::$fileArr as $value) {
//$i用来防止文件重名
$i++;
try {
//查看数组中索引为error的值,看是否存在错误
$error = $value['error'];
if ($error > 0) {
switch ($error) {
case UPLOAD_ERR_INI_SIZE:
throw new MyFileUploadException('文件超过系统指定大小', 101);
break;
case UPLOAD_ERR_FORM_SIZE:
throw new MyFileUploadException('文件超过表单设定大小',102);
break;
case UPLOAD_ERR_PARTIAL:
throw new MyFileUploadException('文件部分被上传',103);
break;
case UPLOAD_ERR_NO_FILE:
throw new MyFileUploadException('没有文件被上传',104);
break;
case UPLOAD_ERR_NO_TMP_DIR:
throw new MyFileUploadException('未找到临时文件夹',105);
break;
case UPLOAD_ERR_CANT_WRITE:
throw new MyFileUploadException('文件写入失败',106);
break;
default:
throw new MyFileUploadException('未知错误',107);
break;
}
}
if (true === is_uploaded_file($value['tmp_name'])) {
self::$extension = pathinfo($value['name'])['extension'];
if (!in_array(self::$extension, self::$fileExtensionAllow))
throw new MyFileUploadException('文件类型非法',201);
$newFileName = self::$uploadDir . "upload{$i}" . date('Ymd', time()) . md5($value['name']) .'.'. self::$extension;
if (move_uploaded_file($value['tmp_name'], $newFileName))
echo '<script>alert("上传成功");location.href="test.html";</script>';
else
throw new MyFileUploadException('文件保存失败',202);
}
} catch (MyFileUploadException $e) {
print $e;
}
}
}
}
3.3 测试页
namespace php\demo;
require 'autoload.php';
use php\demo\lib\FileUpload;
$allow = ['pdf'];
if(empty($_FILES['uploadfile']['name'])&&empty($_FILES['uploadfiles']['name'][0])&&empty($_FILES['uploadfileclass']['name'][0]))
echo '未选择上传文件';
else{
if(!empty($_FILES['uploadfile']['name'])){
FileUpload::save('uploadfile', ['pdf']);
}
if(!empty($_FILES['uploadfiles']['name'][0])){
FileUpload::save('uploadfiles', $allow, true);
}
if(!empty($_FILES['uploadfileclass']['name'][0])){
FileUpload::save('uploadfileclass', $allow, true);
}
}
4 运行效果图