最新的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 相关文章推荐
第十四节--命名空间
Nov 16 PHP
php 将bmp图片转为jpg等其他任意格式的图片
Jun 21 PHP
php下正则来匹配dede模板标签的代码
Aug 21 PHP
php旋转图片90度的方法
Nov 07 PHP
ThinkPHP之getField详解
Jun 20 PHP
php中的四舍五入函数代码(floor函数、ceil函数、round与intval)
Jul 14 PHP
基于PHP技术开发客服工单系统
Jan 06 PHP
全面解读PHP的Yii框架中的日志功能
Mar 17 PHP
PHP模板引擎Smarty之配置文件在模板变量中的使用方法示例
Apr 11 PHP
PHP 绘制网站登录首页图片验证码
Apr 12 PHP
PHP设计模式之装饰器模式定义与用法详解
Apr 02 PHP
PHP+iframe模拟Ajax上传文件功能示例
Jul 02 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
discuz免激活同步登入代码修改方法(discuz同步登录)
2013/12/24 PHP
PHP的压缩函数实现:gzencode、gzdeflate和gzcompress的区别
2016/01/27 PHP
[原创]PHPCMS遭遇会员投稿审核无效的解决方法
2017/01/11 PHP
PHP命名空间namespace的定义方法详解
2017/03/29 PHP
PHP7创建销毁session的实例方法
2020/02/03 PHP
IE中getElementsByName()对有些元素无效的解决方案
2014/09/28 Javascript
JQuery报错Uncaught TypeError: Illegal invocation的处理方法
2015/03/13 Javascript
jquery计算鼠标和指定元素之间距离的方法
2015/06/26 Javascript
JS实现带有3D立体感的银灰色竖排折叠菜单代码
2015/10/20 Javascript
JavaScript数组去重的两种方法推荐
2016/04/05 Javascript
JavaScript自定义函数实现查找两个字符串最长公共子串的方法
2016/11/24 Javascript
用headjs来管理和加载js 提高网站加载速度
2016/11/29 Javascript
js实现PC端和移动端刮卡效果
2020/03/27 Javascript
老生常谈jquery id选择器和class选择器的区别
2017/02/12 Javascript
fullPage.js和CSS3实现全屏滚动效果
2017/05/05 Javascript
利用纯JS实现像素逐渐显示的方法示例
2017/08/14 Javascript
vue自定义全局组件(自定义插件)的用法
2018/01/30 Javascript
JS实现的字符串数组去重功能小结
2019/06/17 Javascript
微信小程序中限制激励式视频广告位显示次数(实现思路)
2019/12/06 Javascript
通过微信公众平台获取公众号文章的方法示例
2019/12/25 Javascript
js最全的数组的降维5种办法(小结)
2020/04/28 Javascript
Python给你的头像加上圣诞帽
2018/01/04 Python
浅析Python四种数据类型
2018/09/26 Python
基于python使用tibco ems代码实例
2019/12/20 Python
win10安装tesserocr配置 Python使用tesserocr识别字母数字验证码
2020/01/16 Python
python pptx复制指定页的ppt教程
2020/02/14 Python
Python图像处理库PIL的ImageFont模块使用介绍
2020/02/26 Python
工程师必须了解的LRU缓存淘汰算法以及python实现过程
2020/10/15 Python
Python如何急速下载第三方库详解
2020/11/02 Python
资产评估专业学生的自我鉴定
2013/11/14 职场文书
高中毕业自我评价
2014/02/08 职场文书
高中课前三分钟演讲稿
2014/08/18 职场文书
小学国旗下的演讲稿
2014/08/28 职场文书
交通安全教育心得体会
2016/01/15 职场文书
Oracle 区块链表创建过程详解
2021/05/15 Oracle
logback 实现给变量指定默认值
2021/08/30 Java/Android