文件上傳配置php
客戶端配置css
一、表單頁面html
二、表單的發送方式爲post數組
三、添加enctype = "multipart/form-data"服務器
<form action="doAction.php" method="post" enctype="multipart/form-data"> 請上傳文件<input type="file" name="myFile" /></br> <input type="submit" value="上傳文件" /> </form>
$_FILES中保存着上傳文件的信息函數
name:上傳文件的名稱post
type:上傳文件的MIME類型ui
tmp_name:上傳到服務器上的臨時文件名this
size:上傳文件的大小spa
error:上傳文件錯誤號
有兩種方式:move_uploaded_file 或 copy
//$_FILES 文件上傳變量 print_r($_FILES); //獲取咱們須要的內容 $filename=$_FILES['myFile']['name']; $type=$_FILES['myFile']['type']; $tmp_name=$_FILES['myFile']['tmp_name']; $error=$_FILES['myFile']['error']; $size=$_FILES['myFile']['size']; //將服務器上的臨時文件移動到指定目錄下 //move_uploaded_file($tmp_name,$destination) //$tmp_name 臨時文件 $destination 指定目錄下 後面跟文件名 move_uploaded_file($tmp_name, "images/".$filename); //copy($src,$dst) 將文件拷貝到指定目錄 拷貝成功返回true 不然返回false //copy($tmp_name,"images/".$filename);
文件上傳配置
PHP php.ini 裏面
服務器端配置:
uploads:
file_uploads = On 支持HTTP上傳
upload_tmp_dir 臨時文件保存的目錄
upload_max_filesize 容許上傳文件的最大值
max_file_uploads 容許一次上傳的最大文件數
post_max_size POST方式發送數據最大值
錯誤信息說明:
UPLOAD_ERR_OK : 值爲0,沒有錯誤發生,文件上傳成功
UPLOAD_ERR_INI_SIZE: 值爲1,上傳的文件超過了php.ini中 upload_max_filesize選項限制的值
UPLOAD_ERR_FORM_SIZE: 值爲2,上傳文件的大小超過了HTML表單中 MAX_FILE_SIZE選項指定的值。
UPLOAD_ERR_PARTIAL: 值爲3,文件只有部分被上傳。
單文件上傳
<?php //$_FILES 文件上傳變量 print_r($_FILES); //獲取咱們須要的內容 $fileInfo=$_FILES['myFile']; $maxSize = 2097152; //容許的最大值 $allowExt = array('jpeg','jpg','png','gif','wbmp'); $flag=true; //檢測是否爲真實圖片類型 //一、判斷錯誤號 if ($fileInfo['error'] == 0){ //判斷上傳文件的大小 if($fileInfo['size']>$maxSize){ exit('上傳文件過大'); } //in_array() 函數搜索數組中是否存在指定的值。判斷下上傳的類型是否是在容許的範圍內 //$ext 上傳文件擴展名 //$allowExt 容許上傳文件類型 //取擴展名 $ext = strtolower(end(explode('.',$fileInfo['name']))) //或者 $ext = pathinfo($fileInfo['name'],PATHINFO_EXTENSION); $ext = pathinfo($fileInfo['name'],PATHINFO_EXTENSION); if(!in_array($ext, $allowExt)){ exit('非法文件類型'); } //判斷文件是不是經過HTTP POST方式上傳來的 //is_uploaded_file()函數判斷指定的文件是不是經過 HTTP POST 上傳的。 if (!is_uploaded_file($fileInfo['tmp_name'])){ exit('文件不是經過HTTP POST方式上傳上來的'); } //檢測是否爲真實的圖片類型 //getimagesize($filename) 獲得指定圖片信息,若是是圖片返回數組 if($flag){ if (!getimagesize($fileInfo['tmp_name'])){ exit('不是真正的圖片類型'); } } $path = 'images'; //臨時目錄 //若是目錄不存在 //file_exists() 函數檢查文件或目錄是否存在。 //mkdir() 函數建立目錄。 //chmod() 函數改變文件模式。 if(!file_exists($path)){ mkdir($path,0777,true); chmod($path, 0777); } //確保文件名惟一,防止重名產生覆蓋 $uniName=md5(uniqid(microtime(true),true)).'.'.$ext; $destination=$path.'/'.$uniName; if (move_uploaded_file($fileInfo['tmp_name'], $destination)){ echo '文件上傳成功'; }else { echo '文件上傳失敗'; } }else{ switch ($fileInfo['error']){ case 1: echo '上傳文件超過了PHP配置文件中upload_max_filesize選項的值'; break; case 2: echo '超過了表單MAX_FILE_SIZE限制的大小'; break; case 3: echo '文件部分被上傳'; break; case 4: echo '沒有選擇上傳文件'; break; case 6: echo '沒有找到臨時目錄'; break; case 7: case 8: echo '系統錯誤'; break; } } ?>
單文件上傳封裝
封裝文件upload.func.php:
<?php //$fileInfo = $_FILES['myFile']; function uploadFile($fileInfo,$allowExt=array('jpeg','jpg','gif','png'),$path = 'images',$flag = true,$maxSize = 2097152){ //判斷錯誤號 if ($fileInfo['error']>0){ switch ($fileInfo['error']){ case 1: $mes = '上傳文件超過了PHP配置文件中upload_max_filesize選項的值'; break; case 2: $mes = '超過了表單MAX_FILE_SIZE限制的大小'; break; case 3: $mes = '文件部分被上傳'; break; case 4: $mes = '沒有選擇上傳文件'; break; case 6: $mes = '沒有找到臨時目錄'; break; case 7: case 8: $mes = '系統錯誤'; break; } echo ( $mes ); return false; } //判斷文件類型 //$allowExt = array('jpeg','jpg','png','gif','wbmp'); $ext = pathinfo ( $fileInfo ['name'], PATHINFO_EXTENSION ); //is_array() 函數用於檢測變量是不是一個數組。 if (!is_array($allowExt)){ exit('系統錯誤,請使用數組的方式'); } if (! in_array ( $ext, $allowExt )) { exit ( '非法文件類型' ); } //判斷文件大小 //$maxSize = 2097152; //2M if ($fileInfo['size']>$maxSize){ exit('上傳文件過大'); } //判斷文件是不是真實圖片 //$flag = true; //var_dump(getimagesize($fileInfo['tmp_name'])); if($flag){ if(!getimagesize($fileInfo['tmp_name'])){ exit('不是真實圖片類型'); } } //判斷是不是HTTP POST請求方式上傳 if (!is_uploaded_file($fileInfo['tmp_name'])){ exit('文件不是經過HTTP POST方式上傳上來的'); } //判斷臨時目錄,建立目錄 //$path = 'images'; //若是目錄不存在 //file_exists() 函數檢查文件或目錄是否存在。 //mkdir() 函數建立目錄。 //chmod() 函數改變文件模式。 if (!file_exists($path)){ mkdir($path,0777,true); chmod($path,0777); } //確保文件名惟一,防止重名產生覆蓋 $uniName = md5(uniqid(microtime(true),true)).'.'.$ext; $destination = $path.'/'.$uniName; //指定目錄下 //判斷是否上傳成功 if (!@move_uploaded_file($fileInfo['tmp_name'], $destination)){ exit('文件上傳失敗'); } //echo '文件上傳成功'; // return array( // 'newName'=>$destination, // 'size'=>$fileInfo['size'], // 'type'=>$fileInfo['type'] // ); return $destination; } ?>
處理文件:doActionfunc.php
<?php header('content-type:text/html;charset=utf-8'); include_once ('upload.func.php'); $fileInfo = $_FILES['myFile']; print_r($fileInfo); // $newName = uploadFile($fileInfo); // echo $newName; // $newName=uploadFile($fileInfo,'imooc'); // echo $newName; //$allowExt='txt'; $allowExt=array('jpeg','jpg','png','gif','html','txt','css'); $newName=uploadFile($fileInfo,$allowExt,'img',true); echo $newName; ?>
HTML頁面
<!DOCTYPE> <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> <title>上傳</title> <meta name="keywords" content="" /> <meta name="description" content="" /> <link href="default.css" rel="stylesheet" type="text/css" /> </head> <body> <form action="doActionfunc.php" method="post" enctype="multipart/form-data"> 請選擇您要上傳的文件:<input type="file" name='myFile' /> <input type="submit" value="上傳文件" /> </form> </body> </html>
多個單文件上傳
<!-- 多文件 單文件 上傳封裝函數 --> <?php /** * 構建上傳文件信息 * @return unknown * 判斷是多個文件仍是單個文件 */ function getFiles(){ $i = 0; foreach ($_FILES as $file){ if (is_string($file['name'])){ $files[$i] = $file; $i++; }elseif (is_array($file['name'])){ foreach ($file['name'] as $key=>$val){ $files[$i]['name'] = $file['name'][$key]; $files[$i]['type'] = $file['type'][$key]; $files[$i]['tmp_name'] = $file['tmp_name'][$key]; $files[$i]['error'] = $file['error'][$key]; $files[$i]['size'] = $file['size'][$key]; $i++; } } } return $files; } function uploadFile($fileInfo,$path='./uploads',$flag=true,$maxSize=1048576,$allowExt=array('jpeg','jpg','png','gif')){ //判斷錯誤號 if($fileInfo['error']===UPLOAD_ERR_OK){ //檢測上傳獲得小 if($fileInfo['size']>$maxSize){ $res['mes']=$fileInfo['name'].'上傳文件過大'; } $ext=getExt($fileInfo['name']); //檢測上傳文件的文件類型 if(!in_array($ext,$allowExt)){ $res['mes']=$fileInfo['name'].'非法文件類型'; } //檢測是不是真實的圖片類型 if($flag&&in_array($ext,$allowExt)){ if(!getimagesize($fileInfo['tmp_name'])){ $res['mes']=$fileInfo['name'].'不是真實圖片類型'; } } //檢測文件是不是經過HTTP POST上傳上來的 if(!is_uploaded_file($fileInfo['tmp_name'])){ $res['mes']=$fileInfo['name'].'文件不是經過HTTP POST方式上傳上來的'; } if(!empty($res)){return $res;} //$path='./uploads'; if(!file_exists($path)){ mkdir($path,0777,true); chmod($path,0777); } $uniName=getUniName(); $destination=$path.'/'.$uniName.'.'.$ext; if(!move_uploaded_file($fileInfo['tmp_name'],$destination)){ $res['mes']=$fileInfo['name'].'文件移動失敗'; } $res['mes']=$fileInfo['name'].'上傳成功'; $res['dest']=$destination; return $res; }else{ //匹配錯誤信息 switch ($fileInfo ['error']) { case 1 : $res['mes'] = '上傳文件超過了PHP配置文件中upload_max_filesize選項的值'; break; case 2 : $res['mes'] = '超過了表單MAX_FILE_SIZE限制的大小'; break; case 3 : $res['mes'] = '文件部分被上傳'; break; case 4 : $res['mes'] = '沒有選擇上傳文件'; break; case 6 : $res['mes'] = '沒有找到臨時目錄'; break; case 7 : case 8 : $res['mes'] = '系統錯誤'; break; } return $res; } } ?>
<?php header('content-type:text/html;charset=utf-8'); include_once ('common.func.php'); include_once ('upload.func1.php'); $files=getFiles(); foreach ($files as $fileInfo){ $res=uploadFile($fileInfo); echo $res['mes'],'<br/>'; $uploadFiles[]=$res['dest']; } $uploadFiles=array_values(array_filter($uploadFiles)); print_r($uploadFiles); ?>
<!DOCTYPE> <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> <title>上傳</title> <meta name="keywords" content="" /> <meta name="description" content="" /> <link href="default.css" rel="stylesheet" type="text/css" /> </head> <body> <form action="doAction1func.php" method="post" enctype="multipart/form-data"> 請選擇您要上傳的文件:<input type="file" name='myFile1' /><br> 請選擇您要上傳的文件:<input type="file" name='myFile[]' /><br> 請選擇您要上傳的文件:<input type="file" name='myFile[]' /><br> 請選擇您要上傳的文件:<input type="file" name='myFile[]' multiple="multiple" /><br> <input type="submit" value="上傳文件" /> </form> </body> </html>
<?php class upload{ protected $fileName; protected $maxSize; protected $allowMime; protected $allowExt; protected $uploadPath; protected $imgFlag; protected $fileInfo; protected $error; protected $ext; /** * @param string $fileName * @param string $uploadPath * @param string $imgFlag * @param number $maxSize * @param array $allowExt * @param array $allowMime */ public function __construct($fileName='myFile',$uploadPath='./uploads',$imgFlag=true,$maxSize=5242880,$allowExt=array('jpeg','jpg','png','gif'),$allowMime=array('image/jpeg','image/png','image/gif')){ $this->fileName=$fileName; $this->maxSize=$maxSize; $this->allowMime=$allowMime; $this->allowExt=$allowExt; $this->uploadPath=$uploadPath; $this->imgFlag=$imgFlag; $this->fileInfo=$_FILES[$this->fileName]; } /** * 檢測上傳文件是否出錯 * @return boolean */ protected function checkError(){ if(!is_null($this->fileInfo)){ if($this->fileInfo['error']>0){ switch($this->fileInfo['error']){ case 1: $this->error='超過了PHP配置文件中upload_max_filesize選項的值'; break; case 2: $this->error='超過了表單中MAX_FILE_SIZE設置的值'; break; case 3: $this->error='文件部分被上傳'; break; case 4: $this->error='沒有選擇上傳文件'; break; case 6: $this->error='沒有找到臨時目錄'; break; case 7: $this->error='文件不可寫'; break; case 8: $this->error='因爲PHP的擴展程序中斷文件上傳'; break; } return false; }else{ return true; } }else{ $this->error='文件上傳出錯'; return false; } } /** * 檢測上傳文件的大小 * @return boolean */ protected function checkSize(){ if($this->fileInfo['size']>$this->maxSize){ $this->error='上傳文件過大'; return false; } return true; } /** * 檢測擴展名 * @return boolean */ protected function checkExt(){ $this->ext=strtolower(pathinfo($this->fileInfo['name'],PATHINFO_EXTENSION)); if(!in_array($this->ext,$this->allowExt)){ $this->error='不容許的擴展名'; return false; } return true; } /** * 檢測文件的類型 * @return boolean */ protected function checkMime(){ if(!in_array($this->fileInfo['type'],$this->allowMime)){ $this->error='不容許的文件類型'; return false; } return true; } /** * 檢測是不是真實圖片 * @return boolean */ protected function checkTrueImg(){ if($this->imgFlag){ if(!@getimagesize($this->fileInfo['tmp_name'])){ $this->error='不是真實圖片'; return false; } return true; } } /** * 檢測是否經過HTTP POST方式上傳上來的 * @return boolean */ protected function checkHTTPPost(){ if(!is_uploaded_file($this->fileInfo['tmp_name'])){ $this->error='文件不是經過HTTP POST方式上傳上來的'; return false; } return true; } /** *顯示錯誤 */ protected function showError(){ exit('<span style="color:red">'.$this->error.'</span>'); } /** * 檢測目錄不存在則建立 */ protected function checkUploadPath(){ if(!file_exists($this->uploadPath)){ mkdir($this->uploadPath,0777,true); } } /** * 產生惟一字符串 * @return string */ protected function getUniName(){ return md5(uniqid(microtime(true),true)); } /** * 上傳文件 * @return string */ public function uploadFile(){ if($this->checkError()&&$this->checkSize()&&$this->checkExt()&&$this->checkMime()&&$this->checkTrueImg()&&$this->checkHTTPPost()){ $this->checkUploadPath(); $this->uniName=$this->getUniName(); $this->destination=$this->uploadPath.'/'.$this->uniName.'.'.$this->ext; if(@move_uploaded_file($this->fileInfo['tmp_name'], $this->destination)){ return $this->destination; }else{ $this->error='文件移動失敗'; $this->showError(); } }else{ $this->showError(); } } }
<?php header('content-type:text/html;charset=utf-8'); require_once 'upload.class.php'; $upload=new upload('myFile1','imooc'); $dest=$upload->uploadFile(); echo $dest;
<!DOCTYPE> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>Insert title here</title> </head> <body> <form action="doAction6.php" method="post" enctype="multipart/form-data"> 請選擇您要上傳的文件:<input type="file" name='myFile1' /> <input type="submit" value="上傳文件" /> </form> </body> </html>