博客列表 >实现多文件上传| MVC与依赖注入的原理

实现多文件上传| MVC与依赖注入的原理

幸福敲门的博客
幸福敲门的博客原创
2021年03月10日 01:07:31801浏览
  1. 写一个实现的多文件上传案例,并将它封装成一个可复用的函数或类
  2. 实例演示MVC与依赖注入的原理,以及服务容器对依赖对象的管理的实现过程。。。。

一、 实现的多文件上传案例,并将它封装成一个可复用的函数或类

uploads文件夹图片(有不同格式图片)
 uploads文件夹图片

1.1demo.php多文件上传逐个上传

  1. <?php
  2. printf('<pre>%s</pre>', print_r($_FILES, true));
  3. foreach ($_FILES as $file) {
  4. if ($file['error'] === 0) {
  5. $path = 'uploads/' . md5(strstr($file['name'] . 'helloworld', '.', true)) . strstr($file['name'], '.');
  6. if (move_uploaded_file($file['tmp_name'], $path)) {
  7. echo "<p style=\"color:violet\">{$file['name']}上传成功</p>";
  8. echo "<img src='{$path}' width='250' />";
  9. }
  10. } else {
  11. include 'list.php';
  12. echo upload_error($error);
  13. }
  14. }
  15. ?>
  16. <!DOCTYPE html>
  17. <html lang="en">
  18. <head>
  19. <meta charset="UTF-8">
  20. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  21. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  22. <title>多文件上传</title>
  23. </head>
  24. <body>
  25. <form action="" method="post" enctype="multipart/form-data">
  26. <fieldset>
  27. <legend>多文件上传</legend>
  28. <input type="hidden" name="MAX_FILE_SIZE" value="10485760">
  29. <input type="file" name="file10">
  30. <input type="file" name="file20">
  31. <button>上传</button>
  32. </fieldset>
  33. </form>
  34. </body>
  35. </html>

图示:
多文件上传逐个上传

1.2 list.php函数库文件

  1. <?php
  2. // 函数库
  3. function upload_error(int $errno) : string
  4. {
  5. switch ($errno) {
  6. case 1:
  7. $msg = '超过的单文件大小';
  8. break;
  9. case 2:
  10. $msg = '超过前端表单限制';
  11. break;
  12. case 3:
  13. $msg = '上传文件不完整';
  14. break;
  15. case 4:
  16. $msg = '没有文件被上传';
  17. break;
  18. case 6:
  19. $msg = '找不到临时目录';
  20. break;
  21. case 7:
  22. $msg = '写入失败,目标目录无写入权限';
  23. default:
  24. exit('未定义错误');
  25. }
  26. return $msg;
  27. }

1.3 demo1.php多文件上传批量上传允许同时选择多个

  1. <?php
  2. // 多文件上传: 批量上传,允许同时选择多个
  3. printf('<pre>%s</pre>', print_r($_FILES, true));
  4. $files = $_FILES['files'] ?? null;
  5. foreach ($files['error'] as $key => $error) {
  6. if ($error === 0) {
  7. $path = 'uploads/' . md5(strstr($files['name'][$key] . 'helloworld', '.', true)) . strstr($files['name'][$key], '.');
  8. if (move_uploaded_file($files['tmp_name'][$key], $path)) {
  9. echo "<p style=\"color:violet\">{$files['name'][$key]}上传成功</p>";
  10. echo "<img src='{$path}' width='260' />";
  11. }
  12. } else {
  13. include 'bank.php';
  14. echo upload_error($error);
  15. }
  16. }
  17. ?>
  18. <!DOCTYPE html>
  19. <html lang="zh-CN">
  20. <head>
  21. <meta charset="UTF-8">
  22. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  23. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  24. <title>多文件上传</title>
  25. </head>
  26. <body>
  27. <form action="" method="post" enctype="multipart/form-data">
  28. <fieldset>
  29. <legend>多文件上传</legend>
  30. <input type="hidden" name="MAX_FILE_SIZE" value="10485760">
  31. <!-- 添加 multipart name的值写成php数组的格式 -->
  32. <input type="file" multiple name="files[]">
  33. <button>上传</button>
  34. </fieldset>
  35. </form>
  36. </body>
  37. </html>

图示:
多文件上传批量上传
多文件上传批量上传
多文件上传批量上传

二 MVC服务容器管理依赖注入
MVC:
M-模型(数据库相关的操作),
V-视图(页面,html),
C-控制器(功能:1.获取数据 2.选择视图)
依赖注入: 简单那来说就是为了解决对象之间的耦合(在一个类中调用其他类的实例)
方法: 在类的外部实例化其他类, 然后以参数的方式传入
服务容器: 将外部依赖(需要引用的外部类实例)进行统一的管理

2.1 Model.php模型文件

  1. <?php
  2. namespace mvc_demo;
  3. use PDO;
  4. // 模型类
  5. class Model
  6. {
  7. // 获取数据
  8. public function getData()
  9. {
  10. $pdo = new PDO('mysql:dbname=phpedu', 'root', 'root');
  11. $stmt = $pdo->prepare('select * from staffs limit 10');
  12. $stmt->execute();
  13. return $stmt->fetchAll(PDO::FETCH_ASSOC);
  14. }
  15. }

2.2View.php视图文件

  1. <?php
  2. namespace mvc_demo;
  3. // 视图
  4. class View
  5. {
  6. // 数据展示
  7. public function fetch($data)
  8. {
  9. $table = '<table border="1" cellspacing="0">';
  10. $table .= '<caption>员工信息表</caption>
  11. <tr bgcolor="lightcyan">
  12. <th>id</th>
  13. <td>姓名</td>
  14. <td>性别</td>
  15. <td>工资</td>
  16. <td>邮箱</td>
  17. <td>生日</td>
  18. </tr>';
  19. foreach ($data as $staff) {
  20. $table .= '<tr>';
  21. $table .= '<td>' . $staff['sid'] . '</td>';
  22. $table .= '<td>' . $staff['name'] . '</td>';
  23. $table .= '<td>' . $staff['gender'] . '</td>';
  24. $table .= '<td>' . $staff['salary'] . '</td>';
  25. $table .= '<td>' . $staff['email'] . '</td>';
  26. $table .= '<td>' . $staff['birthday'] . '</td>';
  27. $table .= '</tr>';
  28. }
  29. $table .= '</table>';
  30. return $table;
  31. }
  32. }

2.3 controller4.php控制器文件

  1. <?php
  2. // 控制器
  3. // 复用构造器实现外部依赖对象的共享
  4. namespace mvc_demo;
  5. // 加载模型
  6. require 'Model.php';
  7. // 加载视图
  8. require 'View.php';
  9. class Controller3
  10. {
  11. private $model;
  12. private $view;
  13. // 构造方法,将依赖的外部对象,在类实例化就导入到当前的类中
  14. public function __construct($model, $view)
  15. {
  16. $this->model = $model;
  17. $this->view = $view;
  18. }
  19. // 1. 获取数据, 2. 选择视图
  20. public function index()
  21. {
  22. //1. 获取数据
  23. $data = $this->model->getData();
  24. //2. 渲染视图
  25. return $this->view->fetch($data);
  26. }
  27. public function hello ()
  28. {
  29. // $model 用不了?
  30. // 如果让依赖的外部对象共享
  31. // $this->model
  32. }
  33. }
  34. // 客户端测试
  35. // 创建控制器对象
  36. $model = new Model();
  37. $view = new View();
  38. $controller = new Controller3($model,$view);
  39. echo $controller->index();

2.4 demo1.php员工信息表

  1. <?php
  2. // 模型: Model, 员工信息表
  3. $pdo = new PDO('mysql:dbname=phpedu', 'root', 'root');
  4. $stmt = $pdo->prepare('select * from staffs limit 10');
  5. $stmt->execute();
  6. $staffs = $stmt->fetchAll(PDO::FETCH_ASSOC);
  7. ?>
  8. <!DOCTYPE html>
  9. <html lang="zh-CN">
  10. <head>
  11. <meta charset="UTF-8">
  12. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  13. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  14. <title>员工信息表</title>
  15. </head>
  16. <body>
  17. <!-- 以下就是视图 View -->
  18. <table border="1" cellspacing="0">
  19. <caption>员工信息表</caption>
  20. <tr bgcolor="lightcyan">
  21. <th>id</th>
  22. <td>姓名</td>
  23. <td>性别</td>
  24. <td>工资</td>
  25. <td>邮箱</td>
  26. <td>生日</td>
  27. </tr>
  28. <?php foreach ($staffs as $staff) : ?>
  29. <tr>
  30. <td><?=$staff['sid']?></td>
  31. <td><?=$staff['name']?></td>
  32. <td><?=$staff['gender']?></td>
  33. <td><?=$staff['salary']?></td>
  34. <td><?=$staff['email']?></td>
  35. <td><?=$staff['birthday']?></td>
  36. </tr>
  37. <?php endforeach ?>
  38. </table>
  39. </body>
  40. </html>

图示:
员工信息表

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