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&amp;&amp;mysql)一
Oct 09 PHP
PHP新手上路(十三)
Oct 09 PHP
php下图片文字混合水印与缩略图实现代码
Dec 11 PHP
PHP similar_text 字符串的相似性比较函数
May 26 PHP
PHP中使用crypt()实现用户身份验证的代码
Sep 05 PHP
zend Framework中的Layout(模块化得布局)详解
Jun 28 PHP
利用curl抓取远程页面内容的示例代码
Jul 23 PHP
php的慢速日志引起的Mysql错误问题分析
May 13 PHP
php通过获取头信息判断图片类型的方法
Jun 26 PHP
php arsort 数组降序排序详细介绍
Nov 17 PHP
如何通过View::first使用Laravel Blade的动态模板详解
Sep 21 PHP
PHP Ajax跨域问题解决方案代码实例
Aug 01 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
常见的四种POST 提交数据方式(小总结)
2015/10/08 PHP
js 表单验证方法(实用)
2009/04/28 Javascript
Mootools 图片展示插件(lightbox,ImageMenu)收集集合
2010/05/21 Javascript
基于jQuery的倒计时实现代码
2012/05/30 Javascript
JS数学函数Exp使用说明
2012/08/09 Javascript
jQuery中slice()方法用法实例
2015/01/07 Javascript
jQuery使用之设置元素样式用法实例
2015/01/19 Javascript
javascript中定义类的方法详解
2015/02/10 Javascript
JavaScript控制table某列不显示的方法
2015/03/16 Javascript
纯JavaScript实现的兼容各浏览器的添加和移除事件封装
2015/03/28 Javascript
javascript中错误使用var造成undefined
2016/03/31 Javascript
JavaScript仿微信打飞机游戏
2020/07/05 Javascript
vue.js 获取当前自定义属性值
2017/06/01 Javascript
深入理解Vue.js源码之事件机制
2017/09/27 Javascript
如何为你的JavaScript代码日志着色详解
2019/04/08 Javascript
微信小程序云开发使用方法新手初体验
2019/05/16 Javascript
微信小程序 Storage更新详解
2019/07/16 Javascript
对Layer弹窗使用及返回数据接收的实例详解
2019/09/26 Javascript
使用Webpack提升Vue.js应用程序的4种方法(翻译)
2019/10/09 Javascript
vue+vant 上传图片需要注意的地方
2021/01/03 Vue.js
[01:21]辉夜杯战队访谈宣传片—CDEC
2015/12/25 DOTA
Python实现自动发送邮件功能
2021/03/02 Python
Django的HttpRequest和HttpResponse对象详解
2018/01/26 Python
Python使用matplotlib模块绘制图像并设置标题与坐标轴等信息示例
2018/05/04 Python
python扫描线填充算法详解
2020/02/19 Python
python如何绘制疫情图
2020/09/16 Python
浅析python字符串前加r、f、u、l 的区别
2021/01/24 Python
纯CSS3制作页面切换效果的实例代码
2019/05/30 HTML / CSS
html5+css如何实现中间大两头小的轮播效果
2018/12/06 HTML / CSS
Raleigh兰令自行车美国官网:英国凤头牌自行车
2018/01/08 全球购物
借名购房协议书范本
2014/10/06 职场文书
2014年军人思想汇报范文
2014/10/12 职场文书
2014年教学管理工作总结
2014/12/02 职场文书
先进个人材料怎么写
2014/12/30 职场文书
高中升旗仪式主持词
2015/07/03 职场文书
运动会200米广播稿
2015/08/19 职场文书