欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

自动加载文件类与单文件多文件上传并封装成类

程序员文章站 2022-03-24 21:20:58
...

自动加载外部类

  1. <?php
  2. // 1.引入绝对路径的load文件
  3. // 1.1可以写到一个文件中进行引入
  4. // require __DIR__ . '/load.php';
  5. // 1.2可以直接写在文件内
  6. spl_autoload_register(function ($class){
  7. // 将class命名空间的目录符更换(因为Windows和Linux的目录符不相同使用目录符常量替换掉)
  8. $path = str_replace('\\',DIRECTORY_SEPARATOR,$class);
  9. // 组建出绝对路径,__DIR__是当前文件的绝对路径 + 目录符 + 命名空间 + .php文件后缀
  10. $file = __DIR__.DIRECTORY_SEPARATOR. $path . '.php';
  11. // 判断文件是否存在
  12. if (!(is_file($file) && file_exists($file)))
  13. throw new Exception('不是文件名文件不存在');
  14. // 文件存在引入文件
  15. require $file;
  16. });
  17. // 2.USE 纯粹进行别名,默认全局开始可以不写'\',inc\lib\Test1和\inc\lib\Test1是一样的
  18. // 要写完整的命名空间信息
  19. use inc\lib\Test1; //等于use lib\Test1 AS Test1;
  20. use lib\Test1 as Test2;
  21. // 3.完全限定名称使用,这个Test1是完全限定名称的别名Test1
  22. echo Test1::$site, '<br>';
  23. echo Test2::$site, '<br>';
  24. ?>

运行结果图:
自动加载文件类与单文件多文件上传并封装成类

自动加载外部类总结

  • 命名空间要与文件夹名字一一对应起来
  • 文件名要与文件的类名对应起来
  • use 要使用完整的命名空间

单文件上传与多文件上传

upfiles.php单文件上传代码:

  1. <?php
  2. // 1.得到数据
  3. $file = $_FILES['my_file'];
  4. // 2.判断错误码是否等于0,不等于0即有错返回对应错误
  5. if(!$file['error'] == 0){
  6. echo '上传失败,返回具体错误信息';
  7. }
  8. // 3.进行文件类型判断,是否合法,在允许上传的类型中
  9. // 举例定义几个类型
  10. $arr = ['jpeg','jpg','png','gif'];
  11. // 取出上传文件的类型
  12. // 方法1、简单的方式是分割,但需要确保文件名只有一个'.' 点符号
  13. // $str = strstr($file['name'],'.');
  14. // 方法2、数组分割取最后一个
  15. $type = array_pop(explode('.',$file['name']));
  16. if(!in_array($type,$arr)){
  17. echo '请上传允许的图片格式';
  18. }
  19. // 4.服务器端可以再一次管理员定义的大小判断,放到类封装中
  20. // 5.存放目录,重命名文件
  21. // 用户自定义的目录
  22. $upPath = 'uploads';
  23. // 进行拼接,用户目录+时间戳+随机数.文件原类型
  24. $destFileName = $upPath.'/'.time().mt_rand(1,1000000).'.'.$type ;
  25. // 获取文件的临时存储信息
  26. $tmpFile = $file['tmp_name'];
  27. // 6.移动文件,完成操作
  28. if (move_uploaded_file($tmpFile, $destFileName)){
  29. echo '<p>上传成功了</p>';
  30. echo '<img src="'. $destFileName .'" width="200">';
  31. }
  32. // print_r($file);
  33. echo '<hr/>';
  34. ?>
  35. <!DOCTYPE html>
  36. <html lang="en">
  37. <head>
  38. <meta charset="UTF-8">
  39. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  40. <title>文件上传</title>
  41. </head>
  42. <body>
  43. <!-- 上传文件的表单需要有两样设置,1.method="post" 2.enctype="multipart/form-data" -->
  44. <form action="" method="POST" enctype="multipart/form-data">
  45. <fieldset>
  46. <legend>单文件</legend>
  47. <!-- 在表单中附带隐藏域将大小限制提交上去,PHP接收到这个会先判断处理文件是否超过这个大小 -->
  48. <input type="hidden" name="MAX_FILE_SIZE" value="500000">
  49. <input type="file" name="my_file" id="">
  50. <input type="submit">
  51. </fieldset>
  52. </form>
  53. </body>
  54. </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

  1. <?php
  2. class UpfileClass{
  3. // 上传的文件名
  4. public $upName = [];
  5. // 保存后的文件名
  6. public $saveName = [];
  7. // 保存后的文件路径
  8. public $saveFilePath = [];
  9. // 所有文件上传的类型
  10. public $type = [];
  11. // 最后上传的文件类型
  12. public $lastType = '';
  13. // 允许上传的文件类型
  14. public $arr = ['jpeg','jpg','png','gif'];
  15. // 文件存储目录
  16. public $savePath = 'uploads';
  17. // 管理员设置的最大size
  18. public $userSetMaxSize = '400kb';
  19. // 主方法,文件上传
  20. public function upfile(array $files){
  21. // 1.判断错误代码
  22. // 没问题返回true,有问题直接提示并重载页面
  23. $this->errorMsg($files['error'],1);
  24. // 2.进行文件判断是否POST进来的数据
  25. if(!is_uploaded_file($files['tmp_name'])){
  26. $this->errorMsg('请通过表单POST数据!');
  27. }
  28. // 3.判断类型
  29. if(!$this->fileType($files['name'])){
  30. $this->errorMsg('类型不符合,请上传允许的格式!');
  31. }
  32. // 4.判断文件大小
  33. if(!$this->fileSize($files['size'])){
  34. $this->errorMsg('大小超过管理员限制的大小'.$this->userSetMaxSize);
  35. }
  36. // 5.检查存放目录,进行加密保存
  37. if(!$this->saveFile($files['tmp_name'])){
  38. $this->errorMsg('存储失败,请联系管理员检查!');
  39. }
  40. $this->upName[] = $files['name'] ;
  41. // 6.返回结果
  42. return true;
  43. }
  44. // 返回错误信息/错误码判断消息
  45. public function errorMsg(string $v, int $a=0){
  46. // 存在$a 进行错误判断
  47. if($a == 1){
  48. switch($v){
  49. case '1':
  50. $msg = '文件超过`php.ini`中`upload_max_filesize`值';
  51. break;
  52. case '2':
  53. $msg = '文件大小超过表单中`MAX_FILE_SIZE`指定的值';
  54. break;
  55. case '3':
  56. $msg = '文件只有部分被上传';
  57. break;
  58. case '4':
  59. $msg = '没有文件被上传';
  60. break;
  61. case '6':
  62. $msg = '找不到临时文件夹';
  63. break;
  64. case '7':
  65. $msg = '文件写入失败';
  66. break;
  67. default:
  68. return true;
  69. }
  70. }else{
  71. $msg = $v;
  72. }
  73. // 不存在返回错误信息
  74. exit( '<script>alert("'.$msg.'");location.replace(document.referrer);</script>');
  75. }
  76. // 判断文件类型
  77. public function fileType($type){
  78. $extension = array_pop(explode('.',$type));
  79. if(in_array($extension,$this->arr)){
  80. $this->type[] = $extension;
  81. $this->lastType = $extension;
  82. return true;
  83. }
  84. return false;
  85. }
  86. // 判断文件大小
  87. public function fileSize($size){
  88. $AdminSetSize = strtolower($this->userSetMaxSize);
  89. if(strpos($AdminSetSize,'mb')){
  90. $sysSize = trim($AdminSetSize,'mb') * 1024 *1024;
  91. }else if(strpos($AdminSetSize,'kb')){
  92. $sysSize = trim($AdminSetSize,'kb') * 1024;
  93. }
  94. if($size < $sysSize){
  95. return true;
  96. }
  97. return false;
  98. }
  99. // 判断文件目录是否存在
  100. public function saveFile($path){
  101. if(!is_dir($this->savePath )){
  102. $this->errorMsg($this->savePath.'目录不存在');
  103. }
  104. // 进行拼接,用户目录+时间戳+随机数.文件原类型
  105. $newName = time().mt_rand(1,1000000).'.'.$this->lastType;
  106. $destFileName = $this->savePath.'/'.$newName;
  107. if (move_uploaded_file($path, $destFileName)){
  108. $this->saveName[] = $newName ;
  109. $this->saveFilePath[] = $destFileName ;
  110. return true;
  111. }
  112. return false;
  113. }
  114. }//class end
  115. ?>

调用代码:

  1. <?php
  2. include 'UpfileClass.php';
  3. $up = new UpfileClass();
  4. if( !empty($_FILES) ){
  5. //如果是多文件就循环调用此方法,单文件将数据数组传入单次调用即可
  6. foreach($_FILES as $file){
  7. //返回值是true/false
  8. $up->upfile($file);
  9. }
  10. }
  11. print_r($up );
  12. //属性里面存储了上传前上传后的数据,进行对应调用即可
  13. print_r($up->saveFilePath);
  14. ?>