登录  /  注册
博主信息
博文 22
粉丝 1
评论 0
访问量 19462
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
0219作业-文件上传类-php培训十期线上班
Dseven
原创
971人浏览过

1 作业完成思路

  • 编写前端文件上传页面,计划用一个页面同步测试单文件和多文件上传
  • 编写文件上传类,用单例模式实现文件上传类
  • 编写测试页

2 类中方法逻辑

2.1 setArr方法

  • 用来将多文件上传时的数组整理成为和单文件上传时一样的数组格式
  • 先判断上传文件的数量
  • 利用for循环取得新的数组

2.2 setsave方法

  • 实现文件上传的主要方法
  • 先判断是否是多文件上传,并数据进行整理
  • 判断文件上传参数error中有无错误代码
  • 判断文件是否合法来源
  • 判断文件扩展名是否合法
  • 定义新的文件名
  • 将临时文件移动到指定位置

2.3 save方法

  • 用来接收初始化参数,实现构造函数的作用
  • 调用setsave方法存放文件

3 demo展示

3.1 前端页面

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>文件上传测试页</title>
  6. <style>
  7. *{margin: 0;padding: 0}
  8. main{margin: 10px auto;width: 940px;}
  9. form{width:940px;display: flex;flex-flow: row nowrap}
  10. div{display: flex;flex-flow: column nowrap;width:300px;
  11. height: 220px;border: 1px solid #55ce9f;align-items: center;margin:10px}
  12. input{border: 1px solid #55ce9f;border-radius: 5px;margin: 5px}
  13. button{margin-top: auto;width: 100px;}
  14. </style>
  15. </head>
  16. <body>
  17. <main>
  18. <form action="fileupload.php" method="post" enctype="multipart/form-data">
  19. <div>
  20. <h2>单个文件上传</h2>
  21. <input type="file" name="uploadfile" >
  22. <button>提交</button>
  23. </div>
  24. <div>
  25. <h2>多个文件上传</h2>
  26. <input type="file" name="uploadfiles[]">
  27. <input type="file" name="uploadfiles[]">
  28. <input type="file" name="uploadfiles[]">
  29. <input type="file" name="uploadfiles[]">
  30. <button>提交</button>
  31. </div>
  32. <div>
  33. <h2>单框上传多个文件</h2>
  34. <input type="file" name="uploadfileclass[]" multiple="multiple">
  35. <button>提交</button>
  36. </div>
  37. </form>
  38. </main>
  39. </body>
  40. </html>

3.2 文件上传类

  1. namespace php\demo\lib;
  2. use php\demo\lib\MyFileUploadException;
  3. class FileUpload
  4. {
  5. /*
  6. * @paparm $fileFormName 用来存放表单空间变量名称,string类型
  7. * @paparm $fileArr 用来存放待上传的数组 array类型
  8. * @paparm $fileExtensionAllow 用来存放可上传的文件类型 array类型
  9. * @paparm $flag 用来标示是否是多文件上传控件 true为多文件上传 false为单文件上传,默认值为false
  10. * @paparm $uploadDir 用来设置文件存路径 默认值为D:\phpstudy_pro\WWW\php\demo\upload\ 需先创建文件夹
  11. * @paparm $extension 用来存放文件扩展名,便于和可上传类型进行比对
  12. */
  13. private static $fileFormName = null;
  14. private static $fileArr = [];
  15. private static $fileExtensionAllow = [];
  16. private static $flag = false;
  17. private static $uploadDir = 'D:\phpstudy_pro\WWW\php\demo\upload\\';
  18. private static $extension;
  19. //私有构造函数,防止实例化类
  20. private function __construct(...$paparm)
  21. {
  22. }
  23. //私有克隆函数,防止实例化类
  24. private function __clone()
  25. {
  26. }
  27. //保存文件方法
  28. public static function save(...$paparm){
  29. list($fileFormName, $fileExtensionAllow, $flag, $uploadDir) = $paparm;
  30. self::$fileFormName = $fileFormName;
  31. self::$fileExtensionAllow = $fileExtensionAllow;
  32. if (!is_null($uploadDir))
  33. self::$uploadDir = $uploadDir;
  34. if (!is_null($flag))
  35. self::$flag = $flag;
  36. self::setSave();
  37. }
  38. //将多文件上传时的数组进行整理
  39. protected static function setArray()
  40. {
  41. $n = count($_FILES[self::$fileFormName]['name']);
  42. for ($i = 0; $i < $n; $i++) {
  43. self::$fileArr[$i]['name'] = $_FILES[self::$fileFormName]['name'][$i];
  44. self::$fileArr[$i]['type'] = $_FILES[self::$fileFormName]['type'][$i];
  45. self::$fileArr[$i]['tmp_name'] = $_FILES[self::$fileFormName]['tmp_name'][$i];
  46. self::$fileArr[$i]['error'] = $_FILES[self::$fileFormName]['error'][$i];
  47. self::$fileArr[$i]['size'] = $_FILES[self::$fileFormName]['size'][$i];
  48. }
  49. return self::$fileArr;
  50. }
  51. //设置文件保存
  52. protected static function setSave()
  53. {
  54. //判断是否为多文件上传
  55. if (self::$flag)
  56. self::$fileArr = self::setArray();
  57. else
  58. //为了统一多文件上传和单文件上传的数组格式,将单文件上传时的数组赋值给一个索引为0的数组
  59. self::$fileArr[0] = $_FILES[self::$fileFormName];
  60. echo '<pre>' . print_r(self::$fileArr, true) . '</pre>';
  61. $i = 0;
  62. foreach (self::$fileArr as $value) {
  63. //$i用来防止文件重名
  64. $i++;
  65. try {
  66. //查看数组中索引为error的值,看是否存在错误
  67. $error = $value['error'];
  68. if ($error > 0) {
  69. switch ($error) {
  70. case UPLOAD_ERR_INI_SIZE:
  71. throw new MyFileUploadException('文件超过系统指定大小', 101);
  72. break;
  73. case UPLOAD_ERR_FORM_SIZE:
  74. throw new MyFileUploadException('文件超过表单设定大小',102);
  75. break;
  76. case UPLOAD_ERR_PARTIAL:
  77. throw new MyFileUploadException('文件部分被上传',103);
  78. break;
  79. case UPLOAD_ERR_NO_FILE:
  80. throw new MyFileUploadException('没有文件被上传',104);
  81. break;
  82. case UPLOAD_ERR_NO_TMP_DIR:
  83. throw new MyFileUploadException('未找到临时文件夹',105);
  84. break;
  85. case UPLOAD_ERR_CANT_WRITE:
  86. throw new MyFileUploadException('文件写入失败',106);
  87. break;
  88. default:
  89. throw new MyFileUploadException('未知错误',107);
  90. break;
  91. }
  92. }
  93. if (true === is_uploaded_file($value['tmp_name'])) {
  94. self::$extension = pathinfo($value['name'])['extension'];
  95. if (!in_array(self::$extension, self::$fileExtensionAllow))
  96. throw new MyFileUploadException('文件类型非法',201);
  97. $newFileName = self::$uploadDir . "upload{$i}" . date('Ymd', time()) . md5($value['name']) .'.'. self::$extension;
  98. if (move_uploaded_file($value['tmp_name'], $newFileName))
  99. echo '<script>alert("上传成功");location.href="test.html";</script>';
  100. else
  101. throw new MyFileUploadException('文件保存失败',202);
  102. }
  103. } catch (MyFileUploadException $e) {
  104. print $e;
  105. }
  106. }
  107. }
  108. }

3.3 测试页

  1. namespace php\demo;
  2. require 'autoload.php';
  3. use php\demo\lib\FileUpload;
  4. $allow = ['pdf'];
  5. if(empty($_FILES['uploadfile']['name'])&&empty($_FILES['uploadfiles']['name'][0])&&empty($_FILES['uploadfileclass']['name'][0]))
  6. echo '未选择上传文件';
  7. else{
  8. if(!empty($_FILES['uploadfile']['name'])){
  9. FileUpload::save('uploadfile', ['pdf']);
  10. }
  11. if(!empty($_FILES['uploadfiles']['name'][0])){
  12. FileUpload::save('uploadfiles', $allow, true);
  13. }
  14. if(!empty($_FILES['uploadfileclass']['name'][0])){
  15. FileUpload::save('uploadfileclass', $allow, true);
  16. }
  17. }

4 运行效果图



批改老师:天蓬老师天蓬老师

批改状态:合格

老师批语:完成的相当出色, 提个小建议, 如果这个类不是final, 建议将内部的self全部替换成static, 以提升该类的扩展性
本博文版权归博主所有,转载请注明地址!如有侵权、违法,请联系admin@php.cn举报处理!
全部评论 文明上网理性发言,请遵守新闻评论服务协议
0条评论
作者最新博文
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2024 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号

  • 登录PHP中文网,和优秀的人一起学习!
    全站2000+教程免费学