Blogger Information
Blog 41
fans 0
comment 0
visits 41299
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
实现多文件上传| MVC与依赖注入的原理
幸福敲门的博客
Original
808 people have browsed it
  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>

图示:
员工信息表

Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post