自动加载文件类与单文件多文件上传并封装成类
程序员文章站
2022-03-24 21:20:58
...
自动加载外部类
<?php
// 1.引入绝对路径的load文件
// 1.1可以写到一个文件中进行引入
// require __DIR__ . '/load.php';
// 1.2可以直接写在文件内
spl_autoload_register(function ($class){
// 将class命名空间的目录符更换(因为Windows和Linux的目录符不相同使用目录符常量替换掉)
$path = str_replace('\\',DIRECTORY_SEPARATOR,$class);
// 组建出绝对路径,__DIR__是当前文件的绝对路径 + 目录符 + 命名空间 + .php文件后缀
$file = __DIR__.DIRECTORY_SEPARATOR. $path . '.php';
// 判断文件是否存在
if (!(is_file($file) && file_exists($file)))
throw new Exception('不是文件名文件不存在');
// 文件存在引入文件
require $file;
});
// 2.USE 纯粹进行别名,默认全局开始可以不写'\',inc\lib\Test1和\inc\lib\Test1是一样的
// 要写完整的命名空间信息
use inc\lib\Test1; //等于use lib\Test1 AS Test1;
use lib\Test1 as Test2;
// 3.完全限定名称使用,这个Test1是完全限定名称的别名Test1
echo Test1::$site, '<br>';
echo Test2::$site, '<br>';
?>
运行结果图:
自动加载外部类总结
- 命名空间要与文件夹名字一一对应起来
- 文件名要与文件的类名对应起来
- use 要使用完整的命名空间
单文件上传与多文件上传
upfiles.php
单文件上传代码:
<?php
// 1.得到数据
$file = $_FILES['my_file'];
// 2.判断错误码是否等于0,不等于0即有错返回对应错误
if(!$file['error'] == 0){
echo '上传失败,返回具体错误信息';
}
// 3.进行文件类型判断,是否合法,在允许上传的类型中
// 举例定义几个类型
$arr = ['jpeg','jpg','png','gif'];
// 取出上传文件的类型
// 方法1、简单的方式是分割,但需要确保文件名只有一个'.' 点符号
// $str = strstr($file['name'],'.');
// 方法2、数组分割取最后一个
$type = array_pop(explode('.',$file['name']));
if(!in_array($type,$arr)){
echo '请上传允许的图片格式';
}
// 4.服务器端可以再一次管理员定义的大小判断,放到类封装中
// 5.存放目录,重命名文件
// 用户自定义的目录
$upPath = 'uploads';
// 进行拼接,用户目录+时间戳+随机数.文件原类型
$destFileName = $upPath.'/'.time().mt_rand(1,1000000).'.'.$type ;
// 获取文件的临时存储信息
$tmpFile = $file['tmp_name'];
// 6.移动文件,完成操作
if (move_uploaded_file($tmpFile, $destFileName)){
echo '<p>上传成功了</p>';
echo '<img src="'. $destFileName .'" width="200">';
}
// print_r($file);
echo '<hr/>';
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>文件上传</title>
</head>
<body>
<!-- 上传文件的表单需要有两样设置,1.method="post" 2.enctype="multipart/form-data" -->
<form action="" method="POST" enctype="multipart/form-data">
<fieldset>
<legend>单文件</legend>
<!-- 在表单中附带隐藏域将大小限制提交上去,PHP接收到这个会先判断处理文件是否超过这个大小 -->
<input type="hidden" name="MAX_FILE_SIZE" value="500000">
<input type="file" name="my_file" id="">
<input type="submit">
</fieldset>
</form>
</body>
</html>
单文件上传运行结果图:
单文件与多文件之间没什么差别,HTML代码的input进行不同的命名,PHP这边进行循环处理即可
多文件上传运行结果图:
文件上传总结
- 需要先检查PHP.ini配置文件中文件上传用到配置例如
file_uploads
,max_file_uploads
,upload_max_filesize
,post_max_size
等等 - HTML代码文件上传的表单需要设置而这两样属性
method="POST"
提交方式enctype="multipart/form-data"
数据编码方式 - 表单中可以设置隐藏域大小
<input type="hidden" name="MAX_FILE_SIZE" value="500000">
PHP接收到会新进行判断文件大小是否超过这个值 - 多文件的input进行不同的命名,PHP使用
$_FILES
进行接收 -
$_FILES
下的数据键名:name
type
tmp_name
error
size
文件上传必定用到的需要记忆下来
自定义了一个文件上传的类
UpfileClass.php
<?php
class UpfileClass{
// 上传的文件名
public $upName = [];
// 保存后的文件名
public $saveName = [];
// 保存后的文件路径
public $saveFilePath = [];
// 所有文件上传的类型
public $type = [];
// 最后上传的文件类型
public $lastType = '';
// 允许上传的文件类型
public $arr = ['jpeg','jpg','png','gif'];
// 文件存储目录
public $savePath = 'uploads';
// 管理员设置的最大size
public $userSetMaxSize = '400kb';
// 主方法,文件上传
public function upfile(array $files){
// 1.判断错误代码
// 没问题返回true,有问题直接提示并重载页面
$this->errorMsg($files['error'],1);
// 2.进行文件判断是否POST进来的数据
if(!is_uploaded_file($files['tmp_name'])){
$this->errorMsg('请通过表单POST数据!');
}
// 3.判断类型
if(!$this->fileType($files['name'])){
$this->errorMsg('类型不符合,请上传允许的格式!');
}
// 4.判断文件大小
if(!$this->fileSize($files['size'])){
$this->errorMsg('大小超过管理员限制的大小'.$this->userSetMaxSize);
}
// 5.检查存放目录,进行加密保存
if(!$this->saveFile($files['tmp_name'])){
$this->errorMsg('存储失败,请联系管理员检查!');
}
$this->upName[] = $files['name'] ;
// 6.返回结果
return true;
}
// 返回错误信息/错误码判断消息
public function errorMsg(string $v, int $a=0){
// 存在$a 进行错误判断
if($a == 1){
switch($v){
case '1':
$msg = '文件超过`php.ini`中`upload_max_filesize`值';
break;
case '2':
$msg = '文件大小超过表单中`MAX_FILE_SIZE`指定的值';
break;
case '3':
$msg = '文件只有部分被上传';
break;
case '4':
$msg = '没有文件被上传';
break;
case '6':
$msg = '找不到临时文件夹';
break;
case '7':
$msg = '文件写入失败';
break;
default:
return true;
}
}else{
$msg = $v;
}
// 不存在返回错误信息
exit( '<script>alert("'.$msg.'");location.replace(document.referrer);</script>');
}
// 判断文件类型
public function fileType($type){
$extension = array_pop(explode('.',$type));
if(in_array($extension,$this->arr)){
$this->type[] = $extension;
$this->lastType = $extension;
return true;
}
return false;
}
// 判断文件大小
public function fileSize($size){
$AdminSetSize = strtolower($this->userSetMaxSize);
if(strpos($AdminSetSize,'mb')){
$sysSize = trim($AdminSetSize,'mb') * 1024 *1024;
}else if(strpos($AdminSetSize,'kb')){
$sysSize = trim($AdminSetSize,'kb') * 1024;
}
if($size < $sysSize){
return true;
}
return false;
}
// 判断文件目录是否存在
public function saveFile($path){
if(!is_dir($this->savePath )){
$this->errorMsg($this->savePath.'目录不存在');
}
// 进行拼接,用户目录+时间戳+随机数.文件原类型
$newName = time().mt_rand(1,1000000).'.'.$this->lastType;
$destFileName = $this->savePath.'/'.$newName;
if (move_uploaded_file($path, $destFileName)){
$this->saveName[] = $newName ;
$this->saveFilePath[] = $destFileName ;
return true;
}
return false;
}
}//class end
?>
调用代码:
<?php
include 'UpfileClass.php';
$up = new UpfileClass();
if( !empty($_FILES) ){
//如果是多文件就循环调用此方法,单文件将数据数组传入单次调用即可
foreach($_FILES as $file){
//返回值是true/false
$up->upfile($file);
}
}
print_r($up );
//属性里面存储了上传前上传后的数据,进行对应调用即可
print_r($up->saveFilePath);
?>