<?php
/*
* [***********************]
* @author: luochen[]
* @Date: 2014-04-23 22:02:45
* @Last Modified time: 2014-04-26 16:29:58
*/
//引入消息类文件
include './Message.class.php';
//引入函数库文件
include "./function.php";
//声明一个上传类并继承Message类的方法
//1.声明类的属性
//2.声明构造函数对类的属性进行初始化
//3.up()函数用来实现上传
//4.move()函数用来实现对文件的移动
//5.filter()函数用来实现对上传文件的筛选
//6.reset_arr()函数用来对上传文件信息数组进行重组
class Upload extends Message{
//上传路径
private $path;
//错误属性
public $error;
//上传允许类型
private $type;
//上传允许大小
private $size;
/**
* [__construct 构造函数,初始化配置]
* @param [type] $path [上传路径]
* @param [type] $size [允许大小]
* @param [type] $type [允许类型]
*/
//构造函数用来初始化配置
public function __construct($path = NULL, $size = NULL, $type = NULL){
//如果上传路径为空则值为默认的
$this->path = is_null($path) ? './Upload/' : $path;
//如果上传文件的大小为空则他的值为2000000
$this->size = is_null($size) ? 2000000 : $size;
//如果上传文件的类型为空,那么就是数组中的任意一个
$this->type = is_null($type) ? array('jpg','png','bmp','gif') : $type;
}
/**
* [up 提供给外部,执行上传]
* @return [type] [description]
*/
//上传方法在单入口文件中被调用,用来实现上传功能
public function up(){
//返回数组赋值给变量$arr
$arr = $this->_reset_arr();
//临时数组,存储上传文件信息
$temp = array();
//循环筛选
foreach ($arr as $v) {
//如果过滤成功,才进行上传
if($this->_filter($v)){
//移动上传
$temp[] = $this->_move($v);
}
}
//最后返回数组
return $temp;
}
/**
* [move 移动上传文件]
* @return [type] [description]
*/
//私有方法只能在本类内部被调用
private function _move($v){
//获取上传文件路径
$path = $this->path;
//将路径进行处理,统一路径
$path = str_replace('\\', '/', $path);
$path = rtrim($path, '/') . '/';
//判断目录是不是存在,如果不存在则进行创建
is_dir($path) || mkdir($path, 0777, true);
//获得文件信息
$fileInfo = pathinfo($v['name']);
//获得类型
$type = $fileInfo['extension'];
//重组文件名
$filename = time() . mt_rand(0,9999) . '.' . $type;
//判断上传文件是不是可以移动上传文件
$bool = move_uploaded_file($v['tmp_name'], $path . $filename);
if($bool){
//如果是则将新的路径存储到数组$v['save']中
$v['save'] = $path . $filename;
}else{
//如果不是$v['save']的值为null
$v['save'] = null;
}
//最后返回数组
return $v;
}
/**
* [_filter 筛选不合格的]
* @return [type] [description]
*/
//私有方法用来筛选不合格的上传文件
private function _filter($v){
//如果$v['name']不为空,因为有可能图片没有上传,直接使用pathinfo会报错
if(!empty($v['name'])){
//获得文件信息
$fileInfo = pathinfo($v['name']);
//获得文件的类型
$type = $fileInfo['extension'];
}
switch (TRUE){
//不是上传文件的判断
case !is_uploaded_file($v['tmp_name']):
$this->error = '不是一个上传文件';
return false;
//上传文件的类型是不是被允许
case !in_array($type, $this->type):
$this->error = '上传类型不允许';
return false;
//上传文件的大小有没有超出范围
case $v['size'] > $this->size:
$this->error = '上传文件超过网站配置项大小';
return false;
//上传文件错误信息的判断
case $v['error'] == 1:
$this->error = '大小超过了php.ini中upload_max_filesize 限制值';
return false;
//上传文件错误信息的判断
case $v['error'] == 2:
$this->error = '大小超过 HTML 表单中 MAX_FILE_SIZE 选项指定的值';
return false;
//上传文件错误信息的判断
case $v['error'] == 3:
$this->error = '文件只有部分被上传';
return false;
//上传文件错误信息的判断
case $v['error'] == 4:
$this->error = '没有文件被上传';
return false;
//默认返回true
default:
return true;
}
}
/**
* [_reset_arr 重组数组]
* @return [type] [description]
*/
//私有方法实现对上传文件数组的重组
private function _reset_arr(){
//声明一个数组
$temp = array();
//循环大数组$_FILES
foreach ($_FILES as $v) {
//如果$v['name']为数组,则是多文件上传,否则就是单文件上传,打印$_FILES便知
if(is_array($v['name'])){
//如果是一个数组则循环$v['name']
foreach ($v['name'] as $key => $value) {
//重新压入数组
$temp[] = array(
'name' => $value,
'type' => $v['type'][$key],
'tmp_name' => $v['tmp_name'][$key],
'error' => $v['error'][$key],
'size' => $v['size'][$key],
);
}
}else{
//如果$v['name']不是一个数组则将他的值赋给数组$temp
$temp[] = $v;
}
}
//返回处理后的数组
return $temp;
}
}
php上传类的实现代码
最新推荐文章于 2022-04-13 12:36:17 发布