PHP学习-----文件操作/上传和下载

  •   在PHP中关于文件和目录的操作,和一般的编程语言没多大区别,很类C。所以一般有C语言基础的话,是很好理解这些关于文件的读,写函数的。
  •  还有关于对文件的增删需要用到一些Linux的命令。涉及到权限的操作,等等。全是Linux下的命令。在此不做多的赘述。
  • 其中PHP5中有一个函数需要特别指出,很实用。
  1. file_get_contents()

  2. file_put_contents()

具体的使用和要注意的事项,在此不多说,PHP手册上已经介绍的太详尽啦~~~

最后是关于文件操作中的上传和下载  的操作。

首先,需要在表单的提交中:  POST方法提交。     类型:enctype="multipart/form-data";建议设置一个hidden表单,设置限制的最大的上传大小。

一般文件上传需要处理的:类型的限制,大小的限制,路径的指定,文件名的修改,从临时目录的转移等等。

在此提供一个图片单文件上传的类,留着以后可以借鉴下:

   class FileUpload{
                private $filepath; //指定上传文件保存的路径
                private $allowtype=array('gif', 'jpg', 'png', 'jpeg'); //充许上传文件的类型
                private $maxsize=1000000; //允上传文件的最大长度 1M
                private $israndname=true; //是否随机重命名, false不随机,使用原文件名
                private $originName; //源文件名称
                private $tmpFileName; //临时文件名
                private $fileType; //文件类型
                private $fileSize; //文件大小
                private $newFileName; //新文件名
                private $errorNum=0; //错误号
                private $errorMess="";//用来提供错误报告 
              //用于对上传文件初使化
                  //1. 指定上传路径, 2,充许的类型, 3,限制大小, 4,是否使用随机文件名称
                //让用户可以不用按位置传参数,后面参数给值不用将前几个参数也提供值
          function __construct($options=array())
              {
                foreach($options as $key=>$val){$key=strtolower($key);
                //查看用户参数中数组的下标是否和成员属性名相同
                    if(!in_array($key,get_class_vars(get_class($this))))
                   {
                     continue;
                   } 
                   $this->setOption($key, $val);
              } 
          
		private function getError(){
			$str="上传文件{$this->originName}时出错:";

			switch($this->errorNum){
				case 4: $str .= "没有文件被上传"; break;
				case 3: $str .= "文件只被部分上传"; break;
				case 2: $str .= "上传文件超过了HTML表单中MAX_FILE_SIZE选项指定的值"; break;
				case 1: $str .= "上传文件超过了php.ini 中upload_max_filesize选项的值"; break;
				case -1: $str .= "末充许的类型"; break;
				case -2: $str .= "文件过大,上传文件不能超过{$this->maxSize}个字节"; break;
				case -3: $str .= "上传失败"; break;
				case -4: $str .= "建立存放上传文件目录失败,请重新指定上传目录"; break;
				case -5: $str .= "必须指定上传文件的路径"; break;

				default: $str .=  "末知错误";
			}

			return $str.'
';
		}
	
		//用来检查文件上传路径
		private function checkFilePath(){
			if(empty($this->filepath)) {
				$this->setOption('errorNum', -5);
				return false;
			}

			if(!file_exists($this->filepath) || !is_writable($this->filepath)){
				if(!@mkdir($this->filepath, 0755)){
					$this->setOption('errorNum', -4);
					return false;
				}
			}
			return true;
		}
		//用来检查文件上传的大小
		private function checkFileSize() {
			if($this->fileSize > $this->maxsize){
				$this->setOPtion('errorNum', '-2');
				return false;
			}else{
				return true;
			}
		}

		//用于检查文件上传类型
		private function checkFileType() {
			if(in_array(strtolower($this->fileType), $this->allowtype)) {
				return true;
			}else{
				$this->setOption('errorNum', -1);
				return false;
			}
		}
		//设置上传后的文件名称
		private function setNewFileName(){
			if($this->israndname){
				$this->setOption('newFileName', $this->proRandName());
			} else {
				$this->setOption('newFileName', $this->originName);
			}
		}



		//设置随机文件名称
		private function proRandName(){
			$fileName=date("YmdHis").rand(100,999);
			return $fileName.'.'.$this->fileType;
		}
	
		private function setOption($key, $val){
			$this->$key=$val;
		}
		//用来上传一个文件
		function uploadFile($fileField){
			$return=true;
			//检查文件上传路径
			if(!$this->checkFilePath()){
				$this->errorMess=$this->getError();
				return false;
			}

			
			$name=$_FILES[$fileField]['name'];
			$tmp_name=$_FILES[$fileField]['tmp_name'];
			$size=$_FILES[$fileField]['size'];
			$error=$_FILES[$fileField]['error'];

			if(is_Array($name)){
				$errors=array();

				for($i=0; $i
  
  
   
   setFiles($name[$i], $tmp_name[$i], $size[$i], $error[$i])){
						if(!$this->checkFileSize() || !$this->checkFileType()){
							$errors[]=$this->getError();
							$return=false;
						}
					}else{
						$error[]=$this->getError();
						$return=false;
					}

					if(!$return)
						$this->setFiles();
				}

				if($return){
					$fileNames=array();

					for($i=0; $i
   
   
    
    setFiles($name[$i], $tmp_name[$i], $size[$i], $error[$i])){
							$this->setNewFileName();
							if(!$this->copyFile()){
								$errors=$this->getError();
								$return=false;
							}else{
								$fileNames[]=$this->newFileName;
							}
						}
					}

					$this->newFileName=$fileNames;
				}

				$this->errorMess=$errors;
				return $return;
			} else {
				
					if($this->setFiles($name, $tmp_name, $size, $error)){
						if($this->checkFileSize() && $this->checkFileType()){
							$this->setNewFileName();

							if($this->copyFile()){
								return true;
							}else{
								$return=false;
							}
								
						}else{
							$return=false;
						}	
					}else{
						$return=false;
					}
					
					

					if(!$return)
						$this->errorMess=$this->getError();


					return $return;
			}			
		}

		private function copyFile(){
			if(!$this->errorNum){
				$filepath=rtrim($this->filepath, '/').'/';
				$filepath.=$this->newFileName;

				if(@move_uploaded_file($this->tmpFileName, $filepath))	{
					return true;
				}else{
					$this->setOption('errorNum', -3);
					return false;
				}
					
			}else{
				return false;
			}
		}

		//设置和$_FILES有关的内容
		private function setFiles($name="", $tmp_name='', $size=0, $error=0){
		
			$this->setOption('errorNum', $error);
				
			if($error){
				return false;
			}

			$this->setOption('originName', $name);
			$this->setOption('tmpFileName', $tmp_name);
			$arrStr=explode('.', $name); 
			$this->setOption('fileType', strtolower($arrStr[count($arrStr)-1]));
			$this->setOption('fileSize', $size);	

			return true;
		}	

		//用于获取上传后文件的文件名
		function getNewFileName(){
			return $this->newFileName;
		}
		//上传如果失败,则调用这个方法,就可以查看错误报告
		function getErrorMsg() {
			return $this->errorMess;
		}
	}
               
   
   
  
  

程序写的很繁杂。可以借鉴~~

 

调用形式:


           $up=new FileUpload(array('isRandName'=>true,'allowType'=>array('txt', 'doc', 'php', 'gif'),'FilePath'=>'./uploads/', 'MAXSIZE'=>200000));
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值