`
student_lp
  • 浏览: 429131 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

php工具类之【文件上传类】

阅读更多
class Upload{	
    // 上传文件的最大值
    public $maxSize = -1;
    // 允许上传的文件后缀
    //  留空不作后缀检查
    public $allowExts = array();
    // 使用对上传图片进行缩略图处理
    public $thumb   =  false;
    // 缩略图最大宽度
    public $thumbMaxWidth=20;
    // 缩略图最大高度
    public $thumbMaxHeight=20;
    // 错误信息
    public $error = '';
    // 上传成功的文件信息
    public $success =array('file'=>'', 'thumb'=>'', 'name'=>'', 'type'=>'', 'size'=>0);

    public function __construct($maxSize='',$allowExts='',$thumb=false,$thumbMaxWidth=100,$thumbMaxHeight=100) {
        if(!empty($maxSize) && is_numeric($maxSize)) {
            $this->maxSize = $maxSize;
        }
        if(!empty($allowExts)) {
            if(is_array($allowExts)) {
                $this->allowExts = array_map('strtolower',$allowExts);
            }else {
                $this->allowExts = explode(',',strtolower($allowExts));
            }
        }
        $this->thumb = $thumb;
        $this->thumbMaxWidth = $thumbMaxWidth;
        $this->thumbMaxHeight = $thumbMaxHeight;
    }
	
	/**
	 * 保存文件,并根据设置决定是否生成缩略图
	 * @param $_FILES $file--要保存的附件
	 * @param String $path--要保存附件的地址
	 * @return boolean
	 */
	public function saveFile($file,$path){
		//判断文件是否存在
		if(empty($file['size'])||empty($file['tmp_name']))
		{
			$this->error = "1-传入的附件不存在";
			return false;	
		}
        //检查文件大小
        if(!$this->_checkSize($file['size'])) {
            $this->error = '2-上传文件大小不符!';
            return false;
        }
		//获取文件的后缀名
		$fileExt = $this->_fileExt($file['name']);
	 	//检查文件类型
        if(!$this->_checkExt($fileExt)) {
            $this->error ='3-上传文件类型不允许';
            return false;
        }
        // 如果是图像文件 检测文件格式
        if(in_array($fileExt,array('gif','jpg','jpeg','bmp','png','swf')) && false === getimagesize($file['tmp_name'])) {
            $this->error = '4-非法图像文件';
            return false;
        }
        //生成文件的完整存储路径
        $childPath = $this->_getFilePath($path);
        if(empty($childPath)){
        	$this->error = "5-出入的文件夹路径不具有写权限";
        	return false;
        }
        //生成文件最终存储路径
        $absolutePath = $path.'/'.$childPath;
        $newFileName = date('YmdHis').$this->_random(4);
        $storePath = $absolutePath.'/'.$newFileName.'.'.$fileExt;
        //保存上传的文件
        if(@copy($file['tmp_name'],$storePath) || (function_exists("move_uploaded_file")&&@move_uploaded_file($file['tmp_name'],$storePath)))
        {
        	@unlink($file['tmp_name']);
        	$this->success['file'] = $childPath.'/'.$newFileName.'.'.$fileExt;
        	$this->success['name'] = $newFileName.'.'.$fileExt;
        	$this->success['type'] = $fileExt;
        	$this->success['size'] = $file['size'];
        }else if(is_readable($file['tmp_name'])){
        	$fp = @fopen($file['tmp_name'], 'rb');
			@flock($fp, 2);
			$attachedContent = @fread($fp, $file['size']);
			@fclose($fp);

			$fp = @fopen($storePath, 'wb');
			@flock($fp, 2);
			if(@fwrite($fp, $attachedContent)){
				@unlink($file['tmp_name']);
				$this->success['file'] = $childPath.'/'.$newFileName.'.'.$fileExt;
        		$this->success['name'] = $newFileName.'.'.$fileExt;
        		$this->success['type'] = $fileExt;
        		$this->success['size'] = $file['size'];
			}
			@fclose($fp);
        }else{
        	$this->error = "6-文件上传保存错误!";
        	return false;
        }

        if($this->thumb && in_array($fileExt,array('gif','jpg','jpeg','bmp','png'))) {
            $image =  getimagesize($storePath);
            if(false !== $image) {
                //是图像文件生成缩略图
                $thumbWidth	 =	$this->thumbMaxWidth;
                $thumbHeight =	$this->thumbMaxHeight;
                $thumbname   = $absolutePath.'/'.$newFileName.'.thumb.jpg';
                $this->success['thumb'] = $childPath.'/'.$newFileName.'.thumb.jpg';
                // 生成图像缩略图
                require_once dirname(__FILE__).'/Image.class.php';
				Image::thumb($storePath,$thumbname,'',$thumbWidth,$thumbHeight,true);
            }
        }
        return true;
    }
	/***
	 * 替换已经存在的文件。
	 * @param:$file-上传的文件。
	 * @param:$absolutePath-源文件的绝对路径。
	 * @return:0-成功;其他-不成功。
	 * */
	public function replaceFile($file,$absolutePath)
	{
		//判断文件是否存在
		if(empty($file['size'])||empty($file['tmp_name']))
		{
			$this->error = "1-传入的附件不存在";
			return false;	
		}
        //检查文件大小
        if(!$this->_checkSize($file['size'])) {
            $this->error = '2-上传文件大小不符!';
            return false;
        }
		//获取文件的后缀名
		$fileExt = $this->_fileExt($file['name']);
	 	//检查文件类型
        if(!$this->_checkExt($fileExt)) {
            $this->error ='3-上传文件类型不允许';
            return false;
        }
		$new_name = $absolutePath;
		$tmp_name = $file['tmp_name'];

		if(@copy($tmp_name, $new_name) || (function_exists('move_uploaded_file') && @move_uploaded_file($tmp_name, $new_name)) || @rename($tmp_name, $new_name)) {
			@unlink($tmp_name);
			return true;
		}elseif(is_readable($tmp_name)) {
			$fp = @fopen($tmp_name, 'rb');
			@flock($fp, 2);
			$attachedfile = @fread($fp, $file['size']);
			@fclose($fp);

			$fp = @fopen($new_name, 'wb');
			@flock($fp, 2);
			if(@fwrite($fp, $attachedfile)) {
				@fclose($fp);
				@unlink($tmp_name);
				return true;
			}
			@fclose($fp);
		}else{
			$this->error = "4-文件上传保存错误!";
			return false;
		}
	}
    
	/**
	 * 获取文件名后缀
	 * @param string $filename--文件名称
	 * @return string--文件后缀
	 **/
	private function _fileExt($filename) {
		return strtolower(trim(substr(strrchr($filename, '.'), 1)));
	}
 	/**
 	 * 检查文件是否允许上传
 	 * @param String $ext--文件的后缀名
 	 * @return boolean--true-允许;false-不允许
 	 */
 	private function _checkExt($ext) {
        if(!empty($this->allowExts))
            return in_array($ext,$this->allowExts,true);
        return true;
    }
    /**
     * 检查文件大小是否超出限制
     * @param int $size--文件实际大小
     * @return boolean
     */
    private function _checkSize($size) {
        return !($size > $this->maxSize) || (-1 == $this->maxSize);
    }
	/**
	 * 生成文件的上传路径
	 * @param String $relativePath--用户传入的相对路径
	 * @return string--为创建出目录返回‘’;创建成功返回用户传入相对路径下生成出存储路径
	 */
	private function _getFilePath($relativePath) {
		$name1 = gmdate('Ym');
		$name2 = gmdate('j');

		$newfilename = $relativePath.'/'.$name1;
		if(!is_dir($newfilename)) {
			if(!@mkdir($newfilename)) {
				return '';
			}
		}
		$newfilename .= '/'.$name2;
		if(!is_dir($newfilename)) {
			if(!@mkdir($newfilename)) {
				return '';
			}
		}
		return $name1.'/'.$name2;
	}
	/**
	 * 生成随机数
	 * @param int $length--生成的随机数长度
	 * @param int $numeric
	 * @return string--随机数
	 */
	private function _random($length, $numeric = 0) {
		PHP_VERSION < '4.2.0' ? mt_srand((double)microtime() * 1000000) : mt_srand();
		$seed = base_convert(md5(print_r($_SERVER, 1).microtime()), 16, $numeric ? 10 : 35);
		$seed = $numeric ? (str_replace('0', '', $seed).'012340567890') : ($seed.'zZ'.strtoupper($seed));
		$hash = '';
		$max = strlen($seed) - 1;
		for($i = 0; $i < $length; $i++) {
			$hash .= $seed[mt_rand(0, $max)];
		}
		return $hash;
	}
}

 

分享到:
评论

相关推荐

    PHP上传视频文件图片工具类

    支持批量上传图片,视频,文件,封装的工具类,可以返回JSON

    php上传excel工具类

    使用php上传excel的工具类,只要引入即可使用,操作方法见我的博客

    php常用工具类.zip

    一个php常用的工具类,它包含了JS弹窗,页面跳转,系统基本参数上传图片,html过滤,数据库输入过滤,清理session,各种验证,格式化,获取ip地址,加载模板,图片水印,文件操作等等很多实用的功能工具,方便大家...

    PclZip(PHP压缩解压工具) 2.8.2.zip

    第三步、将解压后的此软件工具包上传到需要解压的文件同级目录; 第四步、上传之后运行http://网站地址/unzip.php即可。 2、压缩: 第一步、下载此文件包,并在本地解压; 第二步、打开zip.php将../test改为相应...

    八年PHP文件管理器 v2.6.2 免费版.rar

    文件说明: 8.php 八年文件管理器 主文件 独立上传就可以使用了 class.phpmailer.php class.smtp.php 这两个是 smtp类 上传这两个文件就可以 在不支持 email函数的情况下 发送邮件 把这两个文件上传到和 8.php 同一个...

    php常用工具类,包含了JS弹窗,页面跳转,系统基本参数上传图片,html过滤,数据库输入过滤,清理session,各种验证,

    一个php常用的工具类,它包含了JS弹窗,页面跳转,系统基本参数上传图片,html过滤,数据库输入过滤,清理session,各种验证,格式化,获取ip地址,加载模板,图片水印,文件操作等等很多实用的功能工具,方便大家...

    PHP文件上传

    文件上传类 支持各种格式文件 可以增加文件后缀判断 限制文件大小

    MonkeyPHP 3.7.456.zip

    整合mysql备份恢复、购物车类、cookies管理类、curl类、日期工具类、文件下载类、电子邮件类、excel工具类、各种安全过滤工具类、ftp工具类、html代码生成类、模拟http协议类、图像工具类、分页类、拼音工具类、页面...

    用函数管理两个版本的WWW文件PHP3工具

    httpmanage是提供函数管理两个版本的WWW文件PHP3工具。使用它你能够从一个开发服务器上传文件到在线服务器,记录版本之间的差别,并为每个文件保持改变记录。你还能给文件一个确定的状态,等等。"开发中" "等待上创...

    php在线自动解压软件保证能用

    (也可以通过其它途径如 FTP 将文件上传到服务器,这样只要指定其位置即可。) ------------------------------------------------------- 服务器端打包下载操作说明 1 用记事本打开 unzip.php ,在第二行,...

    phpTools.rar

    php常用工具类,包含数组、字符串、url、文件上传、验证、压缩、图片等封装类

    MF00726-PHP信息分类网源码.zip

    注意:不带技术支持,有帮助文件,虚拟商品,发货不退,看好再拍。 开发语言 : PHP 数据库 : MySQL 开发工具 : phpstrom 源码类型 : WebForm 安装简易说明: 上传 → 安装 → 进入后台 → 恢复数据 → 修改cookie...

    PHP精美网站导航全站代码.rar

    多功能精美PHP网站导航代码是以... 1、解压文件,使用上传工具(如FTP)将源码上传到网站空间  2、浏览器打开浏览,将自动跳转到安装页面  3、填写相应数据库信息,确认安装  4、安装完毕,请登陆后台管理操作

    默笙工具箱PHP版v1.0

    默笙工具箱是一个以PHP MySQL进行开发的导航类网站源码。 安装教程: 上传到空间/服务器,导入tools.sql数据文件,修改Common/Conf/config.php数据库信息 本版本集合了30多种工具箱,下个版本会继续更新 后台...

    渝海SEO工具之搜狗关键词筛选工具 1.3 Build 20101129.rar

    欢迎使用渝海SEO工具之搜狗关键词筛选工具,本工具运行环境需求:PHP。 改进描述: 1、修正因搜索引擎调整导致功能失效的缺陷 主要功能: 1、输入一句话帮您分析出最相关的搜狗关键词,方便SEO关键词设计; ...

    PHP动态网页设计与制作案例教程

    8.2.3 PHP文件上传处理 8.3 电子邮件处理 8.3.1 PHP电子邮件处理概述 8.3.2 向客户发送邮件 8.3.3 PHP发送电子邮件的方式 8.4 正则表达式 8.4.1 正则表达式简介 8.4.2 常用表单项验证 8.4.3 正则表达式的...

    KODExplorer开源的Web在线文件管理、代码编辑器v4.40

    它提供了类windows经典用户界面,一整套在线文件管理、文件预览、编辑、上传下载、在线解压缩、音乐播放功能。让你直接在浏览器端实现web开发、源码文件预览、网站部署的同时拥有与本地操作一样方便、快捷、安全的...

    先锋无组件上传类(无惧2.0杜绝上传漏洞修改版) v2004

    默认情况下我们的文件上传到www.***.com/bbs/uploadface/ 文件是用你的上传时间命名的,就是upfile里的这一句 FileName=FormPath&year(now)&month(now)&day(now)&hour(now)&minute(now)&second(now)&ranNum&"."&...

    fckeditor编辑器上传文件(含视频音频)详细配置

    FCKeditor提供了非常强大和易用的文件上传功能,但是默认配置里,文件上传功能不可用,这是基于安全的考虑。但我认为访问安全性控制应该由程序来做,不应由控件来做。 在文件config.ascx中,修改CheckAuthentication...

    php网络开发完全手册

    6.5 文件的上传与下载 99 6.5.1 文件的上传 99 6.5.2 文件的下载 100 6.6 小结 101 第7章 字符的处理与正则表达式 102 7.1 字符类型的特殊性 102 7.2 字符的显示与格式化 102 7.2.1 字符的显示 102 7.2.2 字符的格式...

Global site tag (gtag.js) - Google Analytics