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程序效率优化的一些策略小结
Jul 17 PHP
简单的php数据库操作类代码(增,删,改,查)
Apr 08 PHP
php 获取今日、昨日、上周、本月的起始时间戳和结束时间戳的方法
Sep 28 PHP
php发送post请求的三种方法
Feb 11 PHP
php根据操作系统转换文件名大小写的方法
Feb 24 PHP
php中curl和file_get_content的区别
May 10 PHP
PHP中的use关键字概述
Jul 23 PHP
PHP统计目录中文件以及目录中目录大小的方法
Jan 09 PHP
php连接oracle数据库的方法(测试成功)
May 26 PHP
PHP使用PDO、mysqli扩展实现与数据库交互操作详解
Jul 20 PHP
laravel框架模型中非静态方法也能静态调用的原理分析
Nov 23 PHP
Yii使用EasyWechat实现小程序获取用户的openID的方法
Apr 29 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
PHP 命名空间实例说明
2011/01/27 PHP
php结合正则获取字符串中数字
2015/06/19 PHP
PHP实现Huffman编码/解码的示例代码
2018/04/20 PHP
Yii2框架控制器、路由、Url生成操作示例
2019/05/27 PHP
php生成随机数/生成随机字符串的方法小结【5种方法】
2020/05/27 PHP
jQuery select的操作实现代码
2009/05/06 Javascript
jQuery Tools tooltip使用说明
2012/07/14 Javascript
Javascript算符的优先级介绍
2013/03/20 Javascript
js处理表格对table进行修饰
2014/05/26 Javascript
javascript浏览器兼容教程之事件处理
2014/06/09 Javascript
Three.js利用orbit controls插件(轨道控制)控制模型交互动作详解
2017/09/25 Javascript
vue-resource拦截器设置头信息的实例
2017/10/27 Javascript
一个手写的vue放大镜效果
2019/08/09 Javascript
使用JS来动态操作css的几种方法
2019/12/18 Javascript
Vue列表如何实现滚动到指定位置样式改变效果
2020/05/09 Javascript
Ajax获取node服务器数据的完整步骤
2020/09/20 Javascript
js轮播图之旋转木马效果
2020/10/13 Javascript
antd中table展开行默认展示,且不需要前边的加号操作
2020/11/02 Javascript
vuex的使用和简易实现
2021/01/07 Vue.js
[18:16]sakonoko 2017年卡尔集锦
2018/02/06 DOTA
Pycharm学习教程(2) 代码风格
2017/05/02 Python
python中字符串类型json操作的注意事项
2017/05/02 Python
Python 爬虫图片简单实现
2017/06/01 Python
Python之str操作方法(详解)
2017/06/19 Python
Python实现的科学计算器功能示例
2017/08/04 Python
python训练数据时打乱训练数据与标签的两种方法小结
2018/11/08 Python
详解pycharm连接不上mysql数据库的解决办法
2020/01/10 Python
Python ADF 单位根检验 如何查看结果的实现
2020/06/03 Python
sublime3之内网安装python插件Anaconda的流程
2020/11/10 Python
小区门卫岗位职责
2013/12/31 职场文书
信息专业毕业生五年职业规划参考
2014/02/06 职场文书
《最后的姿势》教学反思
2014/02/27 职场文书
中学生演讲稿
2014/04/26 职场文书
师德模范事迹材料
2014/06/03 职场文书
2019年新郎保证书3篇
2019/10/17 职场文书
比较node.js和Deno
2021/04/27 Javascript