`
student_lp
  • 浏览: 435041 次
  • 性别: 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上传视频文件图片工具类

    这个"PHP上传视频文件图片工具类"提供了一个统一的接口来处理这些操作,并且支持批量上传,使得代码更加简洁高效。同时,该工具类还能够返回JSON格式的数据,这对于前端交互特别有用,因为JSON是目前最广泛使用的...

    php上传excel工具类

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

    php中一个很好用的文件上传类.zip

    在PHP开发中,文件上传是常见的功能之一,用于让用户上传图片、文档等文件到服务器。为了简化这个过程,开发者通常会使用预定义的类库或自定义的上传类。在这个"php中一个很好用的文件上传类.zip"压缩包中,包含了一...

    php多文件上传类.zip

    总的来说,"php多文件上传类.zip" 提供了一个强大的工具,帮助开发者轻松应对多文件上传的挑战。通过理解和运用这个类库,你可以更好地优化你的PHP项目,提升用户体验,同时保证上传过程的安全性和稳定性。

    php上传文件公共类

    在PHP开发中,文件上传功能是常见的需求之一。这个“php上传文件公共类”提供了一个便捷的方法来处理文件上传操作,特别是图片上传。类名为`Upload`,由作者waixin编写,适用于2006年3月16日的PHP环境。 类`Upload`...

    php上传,生成略缩图,加水印工具类.zip

    总结来说,这个压缩包提供的工具类是PHP开发中的实用组件,它整合了文件上传、图像处理和数据库操作的功能,能够大大简化开发流程,提高效率。在使用时,开发者需理解其内部逻辑,根据项目需求进行适当的定制和优化...

    PHP文件上传类,PHP文件上传类

    这个"PHP文件上传类"就是这样一个工具,它对PHP的文件上传功能进行了封装,使得开发者只需简单设置参数即可实现文件上传。 1. **文件上传基础** - PHP中的文件上传是通过`$_FILES`全局数组来处理的,它包含了关于...

    比较全面的php文件上传类.zip

    这个"比较全面的php文件上传类"是一个专门处理文件上传的工具,它封装了相关操作,提供了更方便、安全的方式来处理文件上传过程。下面将详细讲解这个类库的核心知识点及其在实际开发中的应用。 首先,类库的设计...

    php zip文件在线解压工具

    使用这个类,我们可以创建一个在线解压工具,让用户能够上传zip文件并在线解压。 以下是一个简单的示例代码,展示如何使用ZipArchive打开并解压zip文件: ```php &lt;?php $zip = new ZipArchive(); if ($zip-&gt;open('...

    PHP文件上传类+分页类+验证码类

    1. **PHP文件上传类 (Fileupload.class.php)** 文件上传类主要是为了方便用户在Web端上传文件到服务器。`Fileupload.class.php`可能包含了以下关键功能: - **验证文件类型**:确保上传的文件符合预设的格式,例如...

    php常用工具类

    图片上传涉及到文件上传、验证、重命名、移动到特定目录等多个步骤。一个通用的图片上传工具类可以封装这些过程,确保安全性和一致性。关键方法可能包括`uploadImage()`,它处理上传请求,检查文件类型、大小,然后...

    PHP文件上传和邮件发送的类

    总结,`PHP文件上传和邮件发送的类`是一个实用的工具,它简化了开发过程中与文件上传和邮件发送相关的复杂操作,让开发者能更专注于业务逻辑,提高开发效率。同时,它还提供了更好的用户体验,如支持HTML邮件和无需...

    ajaxfileupload 文件上传工具类使用

    **AjaxFileUpload是JavaScript中一个常用的文件上传工具类,它基于AJAX技术,可以在不刷新页面的情况下实现文件的异步上传。这个工具类通常被用于Web应用中,以提升用户体验,因为它允许用户在后台处理文件上传,而...

    php文件上传类

    "php文件上传类"就是一种工具,它可以帮助开发者更高效、更安全地处理文件上传过程。这个类通常包含一系列方法,用于验证文件类型、大小、处理错误以及实际的文件移动操作。下面将详细讨论相关知识点: 1. **文件...

    php支持单个或者多个文件上传类.zip

    这里提到的"php支持单个或者多个文件上传类.zip"就是一个这样的工具,它允许你通过一个简单的类来处理单个或多个文件的上传。 这个类库的核心功能是封装了PHP内置的文件上传处理机制,例如`$_FILES`全局数组,`move...

    PHP文件上传类

    【PHP文件上传类】是一种在PHP开发中处理文件上传功能的工具,它允许用户通过Web表单上传一个或多个文件到服务器。这个类通常包含了处理文件上传的基本逻辑,包括验证文件大小、类型、检查错误、重命名文件以及将...

    php5.6 sftp php_ssh2.dll工具类

    它们可能被这个SFTP工具类调用,以实现各种功能,比如`Crypt`可能用于处理SSH的加密过程,`File`和`Net`可能涉及文件上传下载和网络连接等操作。 总的来说,这个工具类通过PHP 5.6的语法和功能,结合SSH协议,实现...

    PHP文件上传类实例详解_.docx

    PHP 文件上传类实例详解 本文对 PHP 文件上传类进行了详细的实例讲解,分享给大家供大家参考。下面是详细的知识点总结: 一、 PHP 文件上传类的定义 在 PHP 中,文件上传类是指负责处理文件上传的类。这个类通常...

    一个php文件上传处理类库.zip

    在PHP开发中,文件上传是常见的功能之一,用于让用户上传图片、文档等文件到服务器。这个"一个php文件上传处理类库.zip"提供了一个专门处理文件上传的PHP类库,名为"class.upload.php-master",它简化了文件上传的...

    php上传大文件

    这个"php上传大文件"的类提供了处理大文件上传的能力,且不限制文件类型和大小,这意味着它具有高度的灵活性和实用性。下面将详细介绍相关知识点。 首先,PHP默认设置下对单个上传文件的大小和所有文件的总大小都有...

Global site tag (gtag.js) - Google Analytics