博客列表 >自动加载文件类与单文件多文件上传并封装成类

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

Tlilam的PHP之路
Tlilam的PHP之路原创
2020年09月13日 21:18:37814浏览

自动加载外部类

  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. ?>
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议