PHP封装的多文件上传类实例与用法详解


Posted in PHP onFebruary 07, 2017

本文实例讲述了PHP封装的多文件上传类实例与用法。分享给大家供大家参考,具体如下:

<?php
/**//*
 * @(#)UploadFile.php
 *
 * 可同时处理用户多个上传文件。效验文件有效性后存储至指定目录。
 * 可返回上传文件的相关有用信息供其它程序使用。(如文件名、类型、大小、保存路径)
 * 使用方法请见本类底部(UploadFile类使用注释)信息。
 *
 */
class UploadFile {
 var $user_post_file = array(); //用户上传的文件
 var $save_file_path;  //存放用户上传文件的路径
 var $max_file_size;   //文件最大尺寸
 var $last_error;   //记录最后一次出错信息
 //默认允许用户上传的文件类型
 var $allow_type = array('gif', 'jpg', 'png', 'zip', 'rar', 'txt', 'doc', 'pdf');
 var $final_file_path; //最终保存的文件名
 var $save_info = array(); //返回一组有用信息,用于提示用户。
 /**//**
 * 构造函数,用与初始化相关信息,用户待上传文件、存储路径等
 *
 * @param Array $file 用户上传的文件
 * @param String $path 存储用户上传文件的路径
 * @param Integer $size 允许用户上传文件的大小(字节)
 * @param Array $type  此数组中存放允计用户上传的文件类型
 */
 function UploadFile($file, $path, $size = 2097152, $type = '') {
 $this->user_post_file = $file;
 $this->save_file_path = $path;
 $this->max_file_size = $size; //如果用户不填写文件大小,则默认为2M.
 if ($type != '')
  $this->allow_type = $type;
 }
 /**//**
 * 存储用户上传文件,检验合法性通过后,存储至指定位置。
 * @access public
 * @return int  值为0时上传失败,非0表示上传成功的个数。
 */
 function upload() {
 for ($i = 0; $i < count($this->user_post_file['name']); $i++) {
  //如果当前文件上传功能,则执行下一步。
  if ($this->user_post_file['error'][$i] == 0) {
  //取当前文件名、临时文件名、大小、扩展名,后面将用到。
  $name = $this->user_post_file['name'][$i];
  $tmpname = $this->user_post_file['tmp_name'][$i];
  $size = $this->user_post_file['size'][$i];
  $mime_type = $this->user_post_file['type'][$i];
  $type = $this->getFileExt($this->user_post_file['name'][$i]);
  //检测当前上传文件大小是否合法。
  if (!$this->checkSize($size)) {
   $this->last_error = "The file size is too big. File name is: ".$name;
   $this->halt($this->last_error);
   continue;
  }
  //检测当前上传文件扩展名是否合法。
  if (!$this->checkType($type)) {
   $this->last_error = "Unallowable file type: .".$type." File name is: ".$name;
   $this->halt($this->last_error);
   continue;
  }
  //检测当前上传文件是否非法提交。
  if(!is_uploaded_file($tmpname)) {
   $this->last_error = "Invalid post file method. File name is: ".$name;
   $this->halt($this->last_error);
   continue;
  }
  //移动文件后,重命名文件用。
  $basename = $this->getBaseName($name, ".".$type);
  //移动后的文件名
  $saveas = $basename."-".time().".".$type;
  //组合新文件名再存到指定目录下,格式:存储路径 + 文件名 + 时间 + 扩展名
  $this->final_file_path = $this->save_file_path."/".$saveas;
  if(!move_uploaded_file($tmpname, $this->final_file_path)) {
   $this->last_error = $this->user_post_file['error'][$i];
   $this->halt($this->last_error);
   continue;
  }
  //存储当前文件的有关信息,以便其它程序调用。
  $this->save_info[] = array("name" => $name, "type" => $type,
      "mime_type" => $mime_type,
               "size" => $size, "saveas" => $saveas,
               "path" => $this->final_file_path);
  }
 }
 return count($this->save_info); //返回上传成功的文件数目
 }
 /**//**
 * 返回一些有用的信息,以便用于其它地方。
 * @access public
 * @return Array 返回最终保存的路径
 */
 function getSaveInfo() {
 return $this->save_info;
 }
 /**//**
 * 检测用户提交文件大小是否合法
 * @param Integer $size 用户上传文件的大小
 * @access private
 * @return boolean 如果为true说明大小合法,反之不合法
 */
 function checkSize($size) {
 if ($size > $this->max_file_size) {
  return false;
 }
 else {
  return true;
 }
 }
 /**//**
 * 检测用户提交文件类型是否合法
 * @access private
 * @return boolean 如果为true说明类型合法,反之不合法
 */
 function checkType($extension) {
 foreach ($this->allow_type as $type) {
  if (strcasecmp($extension , $type) == 0)
  return true;
 }
 return false;
 }
 /**//**
 * 显示出错信息
 * @param $msg  要显示的出错信息
 * @access private
 */
 function halt($msg) {
 printf("<b><UploadFile Error:></b> %s <br>\n", $msg);
 }
 /**//**
 * 取文件扩展名
 * @param String $filename 给定要取扩展名的文件
 * @access private
 * @return String   返回给定文件扩展名
 */
 function getFileExt($filename) {
 $stuff = pathinfo($filename);
 return $stuff['extension'];
 }
 /**//**
 * 取给定文件文件名,不包括扩展名。
 * eg: getBaseName("j:/hexuzhong.jpg"); //返回 hexuzhong
 *
 * @param String $filename 给定要取文件名的文件
 * @access private
 * @return String 返回文件名
 */
 function getBaseName($filename, $type) {
 $basename = basename($filename, $type);
 return $basename;
 }
}
/**//******************** UploadFile类使用注释
//注意,上传组件name属性不管是一个还是多个都要使用数组形式,如:
<input type="file" name="user_upload_file[]">
<input type="file" name="user_upload_file[]">
//如果用户点击了上传按钮。
if ($_POST['action'] == "上传") {
 //设置允许用户上传的文件类型。
 $type = array('gif', 'jpg', 'png', 'zip', 'rar');
 //实例化上传类,第一个参数为用户上传的文件组、第二个参数为存储路径、
 //第三个参数为文件最大大小。如果不填则默认为2M
 //第四个参数为充许用户上传的类型数组。如果不填则默认为gif, jpg, png, zip, rar, txt, doc, pdf
 $upload = new UploadFile($_FILES['user_upload_file'], 'j:/tmp', 100000, $type);
 //上传用户文件,返回int值,为上传成功的文件个数。
 $num = $upload->upload();
 if ($num != 0) {
 echo "上传成功<br>";
 //取得文件的有关信息,文件名、类型、大小、路径。用print_r()打印出来。
 print_r($upload->getSaveInfo());
 //格式为: Array
 //  (
 //  [0] => Array(
 //    [name] => example.txt
 //    [type] => txt
 //    [size] => 526
 //    [path] => j:/tmp/example-1108898806.txt
 //    )
 //  )
 echo $num."个文件上传成功";
 }
 else {
 echo "上传失败<br>";
 }
}
*/
?>

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
深入解析php模板技术原理【一】
Jan 10 PHP
PHP setcookie设置Cookie用法(及设置无效的问题)
Jul 13 PHP
php实现建立多层级目录的方法
Jul 19 PHP
Yii框架关联查询with用法分析
Dec 02 PHP
yii2.0之GridView自定义按钮和链接用法
Dec 15 PHP
php二维数组合并及去重复的方法
Mar 04 PHP
ThinkPHP2.x防范XSS跨站攻击的方法
Sep 25 PHP
php数组冒泡排序算法实例
May 06 PHP
PHP使用curl函数发送Post请求的注意事项
Nov 26 PHP
PHP实现数组转JSon和JSon转数组的方法示例
Jun 14 PHP
PHP中常用的三种设计模式详解【单例模式、工厂模式、观察者模式】
Jun 14 PHP
简单的php购物车代码
Jun 05 PHP
PHP实现对数组分页处理实例详解
Feb 07 #PHP
php实现的读取CSV文件函数示例
Feb 07 #PHP
php实现的mysqldb读写分离操作类示例
Feb 07 #PHP
PHP验证终端类型是否为手机的简单实例
Feb 07 #PHP
PHP实现多级分类生成树的方法示例
Feb 07 #PHP
PHP常用排序算法实例小结【基本排序,冒泡排序,快速排序,插入排序】
Feb 07 #PHP
php实现图片按比例截取的方法
Feb 06 #PHP
You might like
自定义session存储机制避免会话保持问题
2014/10/08 PHP
php常用数学函数汇总
2014/11/21 PHP
Symfony2创建页面实例详解
2016/03/18 PHP
一段实用的php验证码函数
2016/05/19 PHP
PHP实现验证码校验功能
2017/11/16 PHP
jQuery 判断页面元素是否存在的代码
2009/08/14 Javascript
关于IE、Firefox、Opera页面呈现异同 写脚本很痛苦
2009/08/28 Javascript
前端开发必须知道的JS之原型和继承
2010/07/06 Javascript
{}与function(){}选用空对象{}来存放keyValue
2012/05/23 Javascript
用jQuery模拟select下拉框的简单示例代码
2014/01/26 Javascript
jquery缓动swing liner控制动画过程不同时刻的速度
2014/05/29 Javascript
一个JavaScript递归实现反转数组字符串的实例
2014/10/14 Javascript
Node.js编程中客户端Session的使用详解
2015/06/23 Javascript
JavaScript采用递归算法计算阶乘实例
2015/08/04 Javascript
jQuery实现移动端手机商城购物车功能
2016/09/24 Javascript
js格式化时间的简单实例
2016/11/27 Javascript
基于vuejs实现一个todolist项目
2017/04/11 Javascript
JavaScript执行环境及作用域链实例分析
2018/08/01 Javascript
Vue刷新修改页面中数据的方法
2018/09/16 Javascript
手把手教你写一个微信小程序(推荐)
2018/10/17 Javascript
JS实现的类似微信聊天效果示例
2019/01/29 Javascript
详解webpack编译速度提升之DllPlugin
2019/02/05 Javascript
一文了解vue-router之hash模式和history模式
2019/05/31 Javascript
layui table 列宽百分比显示的实现方法
2019/09/28 Javascript
vue的webcamjs集成方式
2020/11/16 Javascript
Python操作Excel之xlsx文件
2017/03/24 Python
详解python while 函数及while和for的区别
2018/09/07 Python
通过PYTHON来实现图像分割详解
2019/06/26 Python
python绘制双Y轴折线图以及单Y轴双变量柱状图的实例
2019/07/08 Python
浅谈Python线程的同步互斥与死锁
2020/03/22 Python
python实现感知机模型的示例
2020/09/30 Python
瑞士图书网站:Weltbild.ch
2019/09/17 全球购物
失业者真诚求职信范文
2013/12/25 职场文书
社区优秀志愿者先进事迹
2014/05/09 职场文书
OpenCV3.3+Python3.6实现图片高斯模糊
2021/05/18 Python
springboot 全局异常处理和统一响应对象的处理方式
2022/06/28 Java/Android