最新的php 文件上传模型,支持多文件上传


Posted in PHP onAugust 13, 2009
<?php 
class UploadModel 
{ 
protected $keys; 
protected $err = array(); 
protected $target; 
protected $exts; 
protected $maxSize; 
protected $randName; 
protected $files = array(); 
/** 
* 初始化变量 
*/ 
public function __construct() 
{ 
$this->exts = array('jpeg','jpg','gif','png','zip','rar'); 
$this->maxSize = 1024*1024*2; 
$this->target = dirname(__FILE__) . '/upload/'; 
$this->randName = true; 
$this->keys = $this->getKeys(); 
} 
/** 
* 获取 file 的名称 
*/ 
protected function getKeys() 
{ 
$keys = array_keys($_FILES); 
return $keys; 
} 
/** 
* 设置不同类型的变量 
*/ 
public function __set($name, $value) 
{ 
$property = array('target','exts','maxSize','randName'); 
if(!in_array($name, $property)) return false; 
switch(strval($name)) 
{ 
case 'target': 
$this->$name = Configure::read('app_path') . $value; 
break; 
case 'exts': 
$this->$name = explode(',', $value); 
break; 
case 'randName': 
if($value === true || $value == 1) 
{ 
$this->$name = true; 
} 
else { 
$this->$name = false; 
} 
break; 
default: 
$this->$name = $value; 
} 
} 
/** 
* 移动上传的文件到指定的目录 
* @param $fileName 移动单个文件名称的时候,对上传的文件重新命名 
*/ 
public function save($fileName) 
{ 
$this->err = array(); 
$this->files = array(); 
if(!file_exists($this->target)) { 
mkdir($this->target); 
chmod($this->target, 0777); 
} 
foreach($this->keys as $key) 
{ 
if(is_array($_FILES[$key]['name'])) 
{ 
$count = count($_FILES[$key]['name']); 
for($i=0; $i<$count; $i++) 
{ 
$keys = array_keys($_FILES[$key]); 
foreach($keys as $item) 
{ 
$file[$item] = $_FILES[$key][$item][$i]; 
} 
$this->upload($file, $fileName); 
} 
return (count($this->err) > 0)? false:true; 
} 
else { 
return $this->upload($_FILE[$key], $fileName); 
} 
} 
} 
/** 内部处理上传文件的过程 */ 
protected function upload($file, $fileName) 
{ 
if(!is_uploaded_file($file['tmp_name'])) return false; 
if(!$this->checkExt($file)) return false; 
if(!$this->checkSize($file)) return false; 
if($this->randName) 
{ 
$newFileName = $this->target . date('YmdHis', time()) . rand(0,9) . '.' . $this->getExt($file['name']); 
} 
elseif(emptyempty($fileName)) 
{ 
$newFileName = $this->target . '/' . $file['name']; 
} 
else { 
$newFileName = $this->target . '/' . $fileName; 
} 
$result = move_uploaded_file($file['tmp_name'], $newFileName); 
if(!$result) 
{ 
return false; 
} 
else { 
$this->files[] = str_replace($this->target, $newFileName); 
return true; 
} 
} 
/** 
* 是否是可上传的文件类型 
* @param $file 文件对象 
*/ 
public function checkExt($file) 
{ 
if(!in_array($this->getExt($file['name']), $this->exts)) 
{ 
$this->err[] = $file['name'].':ext'; 
return false; 
} 
else { 
return true; 
} 
} 
/** 
* 获取文件后缀名 
*/ 
public function getExt($fileName) 
{ 
$pos = strrpos($fileName, '.')+1; 
return substr($fileName, $pos); 
} 
/** 
* 检查文件大小是否合法 
*/ 
public function checkSize($file) 
{ 
if($size > $this->maxSize) 
{ 
$this->err[] = $file['name'].':max'; 
return false; 
} 
else { 
return true; 
} 
} 
/** 
* 取得已经上传的文件名称 
*/ 
public function getFiles() 
{ 
return $this->files; 
} 
}

使用实例:
include 'uploaded.model.php'; 
$U = new UploadModel(); 
$U->target = '/tmp/'; 
$U->exts = 'jpg,gif'; 
$U->maxSize = 1024*275; //275KB 
$U->save(); 
$files = $U->getFiles(); 
print_r($files); 
include 'uploaded.model.php'; 
$U = new UploadModel(); 
$U->target = '/tmp/'; 
$U->exts = 'jpg,gif'; 
$U->maxSize = 1024*275; //275KB 
$U->save(); 
$files = $U->getFiles(); 
print_r($files);

在 MayFish 里的使用实例:
public function up() 
{ 
$U = M('SYS', 'upload'); 
$U->target = '/tmp/'; 
$U->exts = 'jpg,gif'; 
$U->maxSize = 1024*275; //275KB 
$U->save(); 
header('Location:/?a=upload'); 
} 
public function up() 
{ 
    $U = M('SYS', 'upload'); 
    $U->target = '/tmp/'; 
    $U->exts = 'jpg,gif'; 
    $U->maxSize = 1024*275; //275KB 
    $U->save(); 
    header('Location:/?a=upload'); 
}

前台代码:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title>无标题文档</title> 
</head> 
<body> 
<form action="/?a=up" method="post" enctype="multipart/form-data"> 
<!-- 以下两上file类型控制的name属性可以任意设置,系统会自己取出input 的名称 --> 
<input name="files[]" type="file" size="30" /> 
<input name="files[]" type="file" size="30" /> 
<input type="submit" value="开始上传" /> 
</form> 
</body> 
</html>
PHP 相关文章推荐
php的一个登录的类 [推荐]
Mar 16 PHP
PHP伪造referer实例代码
Sep 20 PHP
PHP 采集获取指定网址的内容
Jan 05 PHP
zend api扩展的php对象的autoload工具
Apr 18 PHP
PHP spl_autoload_register实现自动加载研究
Dec 06 PHP
PHP IDE phpstorm 常用快捷键
May 18 PHP
Discuz!X中SESSION机制实例详解
Sep 23 PHP
Yii2选项卡的简单使用
May 26 PHP
PHP异常处理定义与使用方法分析
Jul 25 PHP
Laravel框架路由和控制器的绑定操作方法
Jun 12 PHP
php实现数组重复数字统计实例
Sep 30 PHP
Laravel5.1框架注册中间件的三种场景详解
Jul 09 PHP
PHP DataGrid 实现代码
Aug 12 #PHP
PHP 执行系统外部命令 system() exec() passthru()
Aug 11 #PHP
php empty函数 使用说明
Aug 10 #PHP
php 取得瑞年与平年的天数的代码
Aug 10 #PHP
php 生成WML页面方法详解
Aug 09 #PHP
彻底杜绝PHP的session cookie错误
Aug 09 #PHP
PHP 5.3.0 安装分析心得
Aug 07 #PHP
You might like
BBS(php &amp; mysql)完整版(六)
2006/10/09 PHP
php数据库连接时容易出错的特殊符号问题
2010/09/01 PHP
php从右向左/从左向右截取字符串的实现方法
2011/11/28 PHP
Smarty foreach控制循环次数的一些方法
2015/07/01 PHP
如何使用jQUery获取选中radio对应的值(一句代码)
2013/06/03 Javascript
js获取或设置当前窗口url参数的小例子
2013/10/14 Javascript
图片动画横条广告带上下滚动可自定义图片、链接等等
2013/10/20 Javascript
js onmousewheel事件多次触发问题解决方法
2014/10/17 Javascript
Javascript变量的作用域和作用域链详解
2015/04/02 Javascript
JavaScript地理位置信息API
2016/06/11 Javascript
微信小程序 支付后台java实现实例
2017/05/09 Javascript
jQuery Validate 校验多个相同name的方法
2017/05/18 jQuery
JS中把函数作为另一函数的参数传递方法(总结)
2017/06/28 Javascript
JS封装的模仿qq右下角消息弹窗功能示例
2018/08/22 Javascript
vue实现浏览器全屏展示功能
2019/11/27 Javascript
JS判断数组四种实现方法详解
2020/06/29 Javascript
[02:45]2016年中国刀塔全程回顾,完美“圣”典即将上演
2016/12/15 DOTA
mac系统安装Python3初体验
2018/01/02 Python
Python数据分析之双色球中蓝红球分析统计示例
2018/02/03 Python
在python里创建一个任务(Task)实例
2020/04/25 Python
在Keras中利用np.random.shuffle()打乱数据集实例
2020/06/15 Python
Python趣味实例,实现一个简单的抽奖刮刮卡
2020/07/18 Python
Python爬虫爬取糗事百科段子实例分享
2020/07/31 Python
详解Django中异步任务之django-celery
2020/11/05 Python
Django视图类型总结
2021/02/17 Python
Luxplus瑞典:香水和美容护理折扣
2018/01/28 全球购物
采用冷却技术的超自然舒适度:GhostBed床垫
2018/09/18 全球购物
运动会广播稿50字
2014/01/26 职场文书
员工试用期考核自我鉴定
2014/04/13 职场文书
节约粮食标语
2014/06/18 职场文书
会计试用期自我评价
2014/09/19 职场文书
机关干部四风问题自查报告及整改措施
2014/10/26 职场文书
2014年安全生产工作总结
2014/11/13 职场文书
医德医风自我评价2015
2015/03/03 职场文书
原来实习报告是这样写的呀!
2019/07/03 职场文书
win10蓝屏0xc0000001安全模式进不了怎么办?win10出现0xc0000001的解决方法
2022/08/05 数码科技