最新的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面向对象全攻略 (十六) 对象的串行化
Sep 30 PHP
PHP MemCached高级缓存配置图文教程
Aug 05 PHP
php学习之数据类型之间的转换代码
May 29 PHP
遍历指定目录下的所有目录和文件的php代码
Nov 27 PHP
php利用curl抓取新浪微博内容示例
Apr 27 PHP
PHP反射使用实例和PHP反射API的中文说明
Jul 02 PHP
thinkphp连贯操作实例分析
Nov 22 PHP
PHP输出多个元素的排列或组合的方法
Mar 14 PHP
Thinkphp5行为使用方法汇总
Dec 21 PHP
PHP简单实现解析xml为数组的方法
May 02 PHP
PHP实现发送微博消息功能完整示例
Dec 04 PHP
PHP7新特性
Mar 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
php源码分析之DZX1.5加密解密函数authcode用法
2015/06/17 PHP
php上传大文件失败的原因及应对策略
2015/10/20 PHP
php编程实现简单的网页版计算器功能示例
2017/04/26 PHP
php中的explode()函数实例介绍
2019/01/18 PHP
jQuery 1.0.2
2006/10/11 Javascript
制作高质量的JQuery Plugin 插件的方法
2010/04/20 Javascript
JavaScript 开发规范要求(图文并茂)
2010/06/11 Javascript
JavaScript 通过模式匹配实现重载
2010/08/12 Javascript
深入理解JavaScript作用域和作用域链
2011/10/21 Javascript
js判断两个日期是否相等的方法
2013/09/10 Javascript
jquery ajax对特殊字符进行转义防止js注入使用示例
2013/11/21 Javascript
javascript 获取HTML DOM父、子、临近节点
2014/06/16 Javascript
javascript匿名函数实例分析
2014/11/18 Javascript
Redis基本知识、安装、部署、配置笔记
2015/03/05 Javascript
javascript清空table表格的方法
2015/05/14 Javascript
JS中判断null的方法分析
2016/11/21 Javascript
基于jquery实现的鼠标悬停提示案例
2016/12/11 Javascript
JavaScript日期对象(Date)基本用法示例
2017/01/18 Javascript
js实现二级导航功能
2017/03/03 Javascript
js实现每日签到功能
2018/11/29 Javascript
vue2.* element tabs tab-pane 动态加载组件操作
2020/07/19 Javascript
原生js+canvas实现贪吃蛇效果
2020/08/02 Javascript
JavaScript中变量提升和函数提升的详解
2020/08/07 Javascript
Python素数检测的方法
2015/05/11 Python
python截取两个单词之间的内容方法
2018/12/25 Python
Python基于当前时间批量创建文件
2020/05/07 Python
使用K.function()调试keras操作
2020/06/17 Python
python 写一个文件分发小程序
2020/12/05 Python
佳能德国网上商店:Canon德国
2017/03/18 全球购物
CAT鞋美国官网:CAT Footwear
2017/11/27 全球购物
巴西美妆购物网站:Kutiz Beauté
2019/03/13 全球购物
Lookfantastic美国/加拿大:英国知名美妆购物网站
2019/03/27 全球购物
日本语毕业生自荐信
2014/02/01 职场文书
介绍长城的导游词
2015/01/30 职场文书
2015学校六五普法工作总结
2015/04/22 职场文书
2015年创先争优工作总结
2015/05/23 职场文书