php文件上传










文件上传类

// 文件上传
// 获取后缀名
// 判断后缀
// 判断大小
// 根据日期生成目录
// 生成随机文件名
// 


define('ROOT','D:/www/0713/');


class upload {
    protected $allowExt = array('jpg','jpeg','gif','png','bmp');
    protected $allowSize = 1; // 最大上传大小,单位为M


    protected $errno = 0;
    protected $error = array(
        0=>'上传完成',
        1=>'文件超出upload_max_filesize',
        2=>'文件超出表单中 MAX_FILE_SIZE 选项指定的值',
        3=>'文件只有部分被上传',
        4=>'没有文件被上传',
        6=>'找不到临时目录',
        7=>'文件定入失败',
        8=>'文件大小超出配置文件的限制',
        9=>'不允许的文件类型',
        10=>'创建目录失败',
        11=>'未知错误,反思中'
    );


    // 获取后缀
    protected function getExt($file) {
        $ext = strtolower(strrchr($file,'.'));


        return $ext;
    }


    // 检验后缀
    protected function checkExt($ext) {
        return in_array(ltrim($ext,'.'),$this->allowExt);
    }


    // 检验大小
    protected function checkSize($size) {
        return $size <= $this->allowSize * 1000 * 1000;
    }


    // 按日期生成目录
    protected function mk_dir() {
        $dir = date('Y/m/d',time());
        $dir = ROOT . 'data/images/' . $dir;


        if(!is_dir($dir)) {
            if(!mkdir($dir,0777,true)) {
                return false;
            }
        }


        return $dir;
    }




    // 生成随机文件名
    protected function randName($n = 6) {
        if($n <= 0) {
            return '';
        }


        $str = 'abcdefghijkmnpqrstuvwxyzABCDEFGHIJKMNPQRSTUVWXYZ0123456789';
        $str = substr(str_shuffle($str),0,$n);


        return $str;
    }


    public function up($name) {
        // $_FILES里面有没有$name指定的单元
        if(!isset($_FILES[$name])) {
            return false;
        }


        $f = $_FILES[$name];


        // 判断错误码,是否上传成功
        if(($this->errno = $f['error']) > 0) {
            return false;
        }


        // 判断大小
        if(!$this->checkSize($f['size'])) {
            $this->errno = 8;
            return false;
        }
        
        // 判断类型
        $ext = $this->getExt($f['name']);
        if(!$this->checkExt($ext)) {
            $this->errno = 9;
            return false;
        }


        // 上传,返回路径
        $path = $this->mk_dir();
        if(!$path) {
            $this->errno = 10;
            return false;
        }


        $filename = $this->randName(6);
        $path = $path . '/' . $filename . $ext;


        if(!move_uploaded_file($f['tmp_name'],$path)) {
            $this->errno = 11;
            return false;
        }
        
        $path = str_replace(ROOT,'',$path);
        return $path;
    }


    // 获取错误的接口
    public function getErr() {
        return $this->error[$this->errno];
    }


    // 设置允许的后缀
    public function setExt($arr) {
        $this->allowExt = $arr;
    }


    // 设置最大上传值
    public function setSize($num=2) {
        $this->allowSize = $num;
    }
}






$upload = new upload();


if($path = $upload->up('pic')) {
    echo $path,'<br />';
    echo '上传成功';
} else {
    echo $upload->getErr();
}

另:

<?php

//var_dump($_POST);
//echo '<hr>';
//var_dump($_FILES);
////sleep(10);
//echo '<hr>';
//echo uniqid('goods_');
//echo '<br>';
//$name = 'iphone.apple.png';
//echo strrchr($name, '.');
//echo '<hr>';
//移动
//move_uploaded_file($_FILES['goods_img']['tmp_name'], './' . $_FILES['goods_img']['name']);

/**
 * 拿到一个上传文件的信息
 * 判断其合理和合法性,移动到指定目标
 *
 * @param $file array 包含了5个上传文件信息的数组
 *
 * @return 成功,目标文件名;失败:false
 */
function upload($file) {
	//判断是否有错误
	if($file['error'] != 0 ) {
		//文件上传错误
		switch ($file['error']) {
			case 1:
				echo '文件太大,超出了php.ini的限制';
			break;
			case 2:
				echo '文件太大,超出了表单内的MAX_FILE_SIZE的限制';
			break;
			case 3:
				echo '文件没有上传完';
			break;
			case 4:
				echo '没有上传文件';
			break;
			case 6:
			case 7:
				echo '临时文件夹错误';
			break;

		}
		return false;
	}
	//判断类型
	$allow_types = array('image/jpeg', 'image/png', 'image/gif');
	if(!in_array($file['type'], $allow_types)) {
		echo '类型不对';
		return false;
	}
	//判断大小
	$max_size = 100000;//100k
	if($file['size'] > $max_size) {
		echo '文件过大';
		return false;
	}

	
	//处于安全性的考虑,判断是否是一个真正的上传文件:
	if( !is_uploaded_file($file['tmp_name'])) {
		echo '上传文件可疑';
		return false;
	}

	//移动
	//通常都会为目标文件重启名字
	//原则是:不重名,没有特殊字符,有一定的意义!
	$dst_file = uniqid('upload_') . strrchr($file['name'], '.');
	if (move_uploaded_file($file['tmp_name'], $dst_file)) {
		//移动成功,上传完毕!
		return $dst_file;
	} else {
		//失败
		echo '移动失败';
		return false;
	}
}

$result = upload($_FILES['goods_img']);
echo '<hr>';
var_dump($result);


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值