开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 6295|回复: 5
收起左侧

[技术专题] php文件上传类,保存下以后不用写了

[复制链接]
结帖率:33% (1/3)
发表于 2020-10-12 21:55:30 | 显示全部楼层 |阅读模式   河南省开封市
本帖最后由 leka520 于 2020-10-12 22:05 编辑

自己记录保存一哈,以后用到直接找,直接上代码............
  1. <?php
  2. $up = new Upload();
  3. $newPath = $up->uploadFile('fm');
  4. if ($newPath === false) {
  5.     var_dump($up->errorNumber);
  6.     var_dump($up->errorInfo);
  7. } else {
  8.     echo $newPath;
  9. }

  10. class Upload
  11. {
  12.     //文件上传保存路径
  13.     protected $path = './upload/';
  14.     //允许文件上传的后缀
  15.     protected $allowSuffix = ['jpg', 'jpeg', 'gif', 'wbmp', 'png'];
  16.     //允许文件上传的 Mime 类型
  17.     protected $allowMime = ['image/jpeg', 'image/gif', 'image/wbmp', 'image/png'];
  18.     //允许文件上传的文件最大大小
  19.     protected $maxSize = 2000000;
  20.     //是否启用随机名
  21.     protected $isRandName = true;
  22.     //加上文件前缀
  23.     protected $prefix = 'up_';

  24.     //自定义的错误号码和错误信息
  25.     protected $errorNumber;
  26.     protected $errorInfo;

  27.     //文件的信息
  28.     protected $oldName; //文件名
  29.     protected $suffix; //文件后缀
  30.     protected $size; //文件大小
  31.     protected $mime; //文件 mime
  32.     protected $tmpName; //文件临时路径
  33.     protected $newName; //文件新名字

  34.     public function __construct($arr = [])
  35.     {
  36.         foreach ($arr as $key => $value) {
  37.             $this->setOption($key, $value);
  38.         }
  39.     }

  40.     public function __get($name)
  41.     {
  42.         if ($name == 'errorNumber') {
  43.             return $this->errorNumber;
  44.         } else if ($name == 'errorInfo') {
  45.             return $this->getErrorInfo();
  46.         }
  47.     }

  48.     /**
  49.      * 判断这个$key 是不是我的成员属性,如果是,则设置
  50.      *
  51.      * @param [type] $key
  52.      * @param [type] $value
  53.      * @return void
  54.      */
  55.     protected function setOption($key, $value)
  56.     {
  57.         //得到所有的成员属性
  58.         $keys = array_keys(get_class_vars(__CLASS__));
  59.         if (in_array($key, $keys)) {
  60.             $this->$key = $value;
  61.         }
  62.     }

  63.     /**
  64.      * 文件上传函数
  65.      * $key 就是你 input 框中的 name 属性值
  66.      *
  67.      * @param [type] $key
  68.      * @return void
  69.      */
  70.     public function uploadFile($key)
  71.     {
  72.         //判断有没有设置路径  path
  73.         if (empty($this->path)) {
  74.             $this->setOption('errorNumber', -1);
  75.             return false;
  76.         }
  77.         //判断该路径是否存在,是否可写
  78.         if (!$this->check()) {
  79.             $this->setOption('errorNumber', -2);
  80.             return false;
  81.         }
  82.         //判断$_FILES 里面的 error 信息是否为 0,如果为 0,说明文件信息在服务器端可以直接获取,提取信息保存到成员属性中
  83.         $error = $_FILES[$key]['error'];
  84.         if ($error) {
  85.             $this->setOption('errorNumber', $error);
  86.             return false;
  87.         } else {
  88.             //提取文件相关信息并且保存到成员属性中
  89.             $this->getFileInfo($key);
  90.         }
  91.         //判断文件的大小、mime、后缀是否符合
  92.         if (!$this->checkSize() || !$this->checkMime() || !$this->checkSuffix()) {
  93.             return false;
  94.         }
  95.         //得到新的文件名字
  96.         $this->newName = $this->createNewName();
  97.         //判断是否是上传文件,并且移动上传文件
  98.         if (is_uploaded_file($this->tmpName)) {
  99.             if (move_uploaded_file($this->tmpName, $this->path . $this->newName)) {
  100.                 return $this->path . $this->newName;
  101.             } else {
  102.                 $this->setOption('errorNumber', -7);
  103.                 return false;
  104.             }
  105.         } else {
  106.             $this->setOption('errorNumber', -6);
  107.             return false;
  108.         }
  109.     }

  110.     /**
  111.      * 得到文件的新名字
  112.      *
  113.      * @return void
  114.      */
  115.     protected function createNewName()
  116.     {
  117.         //判断是否使用随机名
  118.         if ($this->isRandName) {
  119.             $name = $this->prefix . uniqid() . '.' . $this->suffix;
  120.         } else {
  121.             $name = $this->prefix . $this->oldName;
  122.         }
  123.         return $name;
  124.     }

  125.     /**
  126.      * 判断该路径是否存在,是否可写
  127.      *
  128.      * @return void
  129.      */
  130.     protected function check()
  131.     {
  132.         //文件夹不存在或者不是目录。创建文件夹
  133.         if (!file_exists($this->path) || !is_dir($this->path)) {
  134.             return mkdir($this->path, 0777, true);
  135.         }
  136.         //判断文件是否可写
  137.         if (!is_writeable($this->path)) {
  138.             return chmod($this->path, 0777);
  139.         }
  140.         return true;
  141.     }

  142.     /**
  143.      * 提取文件相关信息并且保存到成员属性中
  144.      *
  145.      * @param [type] $key
  146.      * @return void
  147.      */
  148.     protected function getFileInfo($key)
  149.     {
  150.         // 得到文件名字
  151.         $this->oldName = $_FILES[$key]['name'];
  152.         //得到文件的 mime 类型
  153.         $this->mime = $_FILES[$key]['type'];
  154.         //得到文件临时路径
  155.         $this->tmpName = $_FILES[$key]['tmp_name'];
  156.         //得到文件大小
  157.         $this->size = $_FILES[$key]['size'];
  158.         //得到文件后缀
  159.         $this->suffix = pathinfo($this->oldName)['extension'];
  160.     }

  161.     /**
  162.      * 判断文件大小
  163.      *
  164.      * @return void
  165.      */
  166.     protected function checkSize()
  167.     {
  168.         if ($this->size > $this->maxSize) {
  169.             $this->setOption('errorNumber', -3);
  170.             return false;
  171.         }
  172.         return true;
  173.     }

  174.     /**
  175.      * 判断文件的 mime 是否符合
  176.      *
  177.      * @return void
  178.      */
  179.     protected function checkMime()
  180.     {
  181.         if (!in_array($this->mime, $this->allowMime)) {
  182.             $this->setOption('errorNumber', -4);
  183.             return false;
  184.         }
  185.         return true;
  186.     }

  187.     /**
  188.      * 判断文件的后缀是否符合
  189.      *
  190.      * @return void
  191.      */
  192.     protected function checkSuffix()
  193.     {
  194.         if (!in_array($this->suffix, $this->allowSuffix)) {
  195.             $this->setOption('errorNumber', -5);
  196.             return false;
  197.         }
  198.         return true;
  199.     }

  200.     /**
  201.      * 返回错误信息
  202.      *
  203.      * @return void
  204.      */
  205.     protected function getErrorInfo()
  206.     {
  207.         switch ($this->errorNumber) {
  208.             case -1:
  209.                 $str = '文件路径没有设置';
  210.                 break;
  211.             case -2:
  212.                 $str = '文件路径不是目录或者没有权限';
  213.                 break;
  214.             case -3:
  215.                 $str = '文件大小超过指定范围';
  216.                 break;
  217.             case -4:
  218.                 $str = '文件 mime 类型不符合';
  219.                 break;
  220.             case -5:
  221.                 $str = '文件后缀不符合';
  222.                 break;
  223.             case -6:
  224.                 $str = '不是上传文件';
  225.                 break;
  226.             case -7:
  227.                 $str = '文件上传失败';
  228.                 break;
  229.             case 1:
  230.                 $str = '文件超出 php.ini 设置大小';
  231.                 break;
  232.             case 2:
  233.                 $str = '文件超出 html 设置大小';
  234.                 break;
  235.             case 3:
  236.                 $str = '文件部分上传';
  237.                 break;
  238.             case 4:
  239.                 $str = '没有文件上传';
  240.                 break;
  241.             case 6:
  242.                 $str = '找不到临时文件';
  243.                 break;
  244.             case 7:
  245.                 $str = '文件写入失败';
  246.                 break;
  247.         }
  248.         return $str;
  249.     }
  250. }
复制代码
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.     <meta http-equiv="X-UA-Compatible" content="ie=edge">
  7.     <title>上传文件</title>
  8. </head>
  9. <body>
  10.     <form action="Upload.php" method="post" enctype="multipart/form-data">
  11.         <input type="file" name="fm">
  12.         <br />
  13.         <input type="submit" value="上传">
  14.     </form>
  15. </body>
  16. </html>
复制代码


结帖率:25% (6/24)

签到天数: 14 天

发表于 2022-6-8 10:29:24 | 显示全部楼层   黑龙江省大庆市
有易语言调用代码就更好了
回复 支持 反对

使用道具 举报

结帖率:89% (17/19)
发表于 2020-12-14 23:05:32 高大上手机用户 | 显示全部楼层   浙江省金华市
果断先收藏了
回复 支持 反对

使用道具 举报

发表于 2020-11-22 19:24:05 | 显示全部楼层   江苏省苏州市
挺好用的
回复 支持 反对

使用道具 举报

发表于 2020-10-22 21:53:40 | 显示全部楼层   广东省深圳市
来看看,好复杂
回复 支持 反对

使用道具 举报

头像被屏蔽
发表于 2020-10-20 21:02:34 | 显示全部楼层   河南省洛阳市
来看看,好复杂
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表