基本上如今的各類網站都會涉及到圖片上傳,所以有一個適應性強的圖片上傳標準化類庫是有必要的。該Class能夠根據網站具體要求,經過一組自定義參數將圖片尺寸按下述方式進行調整並上傳到指定路徑。前端
該類能夠實現以下要求:ajax
1. 我只須要關注圖片寬度,例如微博人人等社交網站或照片流模式網站上的圖片(limit='width'):當寬度大於規定值時,圖片寬度重置至規定值,同時高度等比自適應;默認狀況下,若是上傳的圖片寬度小於規定值,也將按此方式調整,您能夠設置'autoAdjust'=false 來停用該功能。json
2. 我只須要關注圖片高度,例如當相冊預覽時想保證橫向圖片列表的規則性(limit='height'):當高度大於規定值時,圖片高度重置至規定值,同時寬度等比自適應;默認狀況下,若是上傳的圖片高度小於規定值,也將按此方式調整,您能夠設置'autoAdjust'=false 來停用該功能。函數
3. 我但願圖片的寬度和高度都不能超過規定值(limit='both'):此時,函數會自動判斷圖片寬高比,並保證圖片的寬或高都不超過時望值。此時您仍能夠設置'autoAdjust'=false 來停用對寬或高都小於規定值的圖片的自動放大功能。網站
4. 不對圖片尺寸作任何調整(limit=false): 此時,圖片會按照原尺寸保存到指定的目錄下。this
參數及其默認值:spa
1 'uploadDir' => 'uploads',// 定義上傳文件目錄 2 'fileTypes' => array('jpg', 'jpeg', 'gif', 'png'),//合法文件類型 3 'inputName' => 'file',//上傳文件域(input)名,既提交的表單中文件input的名稱 4 'fileName' => null,//指望的文件名,若是不設置則使用類中自帶的命名規則 5 'limit' => 'both',//尺寸限制,默認寬高全限制,options:'width'(只關注寬度),'height'(只關注高度),(bool)false 6 'width' => 600,//缺省圖片寬度 7 'height' => 600,//缺省圖片高度 8 'autoAdjust'=> true //小於指望尺寸的圖片是否自適應擴大到規定尺寸
返回值:code
目前常採用ajax的方式來進行上傳或者獲取返回信息,所以在類的最後採用了簡單的json形式的輸出:blog
1 echo json_encode(array('name'=>$datebaseFileName,'width'=>$target_width,'height'=>$target_height));
前端接收到反饋數據並以json方式讀取後,能夠採用 data.name(文件名),data.height(圖片高度) 及 data.width(圖片寬度) 來使用這些數據。圖片
類庫源碼以下:
1 class Imageupload{ 2 private $settings = array(); 3 4 public function __construct() { 5 //參數默認值 6 $this->settings = array ( 7 'uploadDir' => 'uploads',// 定義上傳文件目錄 8 'fileTypes' => array('jpg', 'jpeg', 'gif', 'png'),//合法文件類型 9 'inputName' => 'file',//上傳文件域(input)名 10 'fileName' => null, 11 'limit' => 'both',//尺寸限制,默認寬高全限制,options:'width'(只關注寬度),'height'(只關注高度),(bool)false 12 'width' => 600, 13 'height' => 600, 14 'autoAdjust'=> true //小於指望尺寸的圖片是否自適應擴大到規定尺寸 15 ); 16 } 17 18 public function options( $options=null ){ 19 $options = (array)$options; 20 $this->settings = array_merge( $this->settings, $options ); 21 } 22 23 public function execute(){ 24 if( !isset($_FILES[ $this->settings['inputName'] ]) || !is_uploaded_file($_FILES[ $this->settings['inputName'] ]['tmp_name']) ) {echo 'Undifined File';return false;} 25 $tempFile = $_FILES[ $this->settings['inputName'] ]['tmp_name']; 26 $temp_info = getimagesize($tempFile); 27 switch($temp_info[2]){ //取得圖片的格式 28 case 1:$FileType='gif';break; 29 case 2:$FileType='jpg';break; 30 case 3:$FileType='png';break; 31 default:return false;//未知的文件格式 32 } 33 //默認文件名建立規則 34 if(is_null($this->settings['fileName'])) $this->settings['fileName'] = date("YmdHis").rand(100000,999999); 35 $uploadDir = $_SERVER['DOCUMENT_ROOT'] .'/'. $this->settings['uploadDir']; 36 $datebaseFileName = $this->settings['fileName']. '.' .strtolower($FileType); 37 $targetFile = $uploadDir .'/'. $datebaseFileName; 38 //echo $uploadDir; 39 // 驗證文件後綴 40 $fileParts = pathinfo($_FILES[ $this->settings['inputName'] ]['name']); 41 if (in_array( strtolower($fileParts['extension']), $this->settings['fileTypes'] ) ) { 42 // 保存文件至指定目錄 43 move_uploaded_file($tempFile, $targetFile); 44 // 重置圖片尺寸 45 // 讀取源圖文件信息 46 $img_info = getimagesize($targetFile); 47 // 獲取原圖尺寸並賦值給變量 48 list($width, $height)=$img_info; 49 $target_width = $width; 50 $target_height = $height; 51 // 調整圖片尺寸 52 if($this->settings['limit']!=false){ 53 switch ($this->settings['limit']) 54 { 55 case 'width': 56 if( ($width<$this->settings['width'] && $this->settings['autoAdjust']) || $width>$this->settings['width'] ){ 57 $target_width = $this->settings['width']; 58 $target_height = ceil($target_width * $height / $width); 59 } 60 break; 61 case 'height': 62 if( ($height<$this->settings['height'] && $this->settings['autoAdjust']) || $height>$this->settings['height'] ){ 63 $target_height = $this->settings['height']; 64 $target_width = ceil($target_height * $width / $height); 65 } 66 break; 67 default: 68 if( ($width<$this->settings['width'] && $height<$this->settings['height'] && $this->settings['autoAdjust']) || $width>$this->settings['width'] || $height>$this->settings['height'] ){ 69 if( $width/$height > $this->settings['width']/$this->settings['height'] ){ 70 $target_width = $this->settings['width']; 71 $target_height = ceil($target_width * $height / $width); 72 }else{ 73 $target_height = $this->settings['height']; 74 $target_width = ceil($target_height * $width / $height); 75 } 76 } 77 } 78 } 79 80 // 定期望尺寸建立目標文件圖牀 81 $target_img = imagecreatetruecolor($target_width,$target_height); 82 // 採用特定函數讀取源圖,並存入內存 83 switch($img_info[2]){ //取得圖片的格式 84 case 1:$source_img=imagecreatefromgif($targetFile);break; 85 case 2:$source_img=imagecreatefromjpeg($targetFile);break; 86 case 3:$source_img=imagecreatefrompng($targetFile);break; 87 default:return false;//未知的文件格式 88 } 89 //將源圖按參數寫入圖牀 90 imagecopyresized($target_img,$source_img,0,0,0,0,$target_width,$target_height,$width,$height); 91 //採用特定函數保存新圖,覆蓋源圖 92 switch($img_info[2]){ //取得圖片的格式 93 case 1:imagegif($target_img,$targetFile);break; 94 case 2:imagejpeg($target_img,$targetFile);break; 95 case 3:imagepng($target_img,$targetFile);break; 96 default:return false;//未知的文件格式 97 } 98 //輸出圖片基本信息(非必須) 99 echo json_encode(array('name'=>$datebaseFileName,'width'=>$target_width,'height'=>$target_height)); 100 } else { 101 // 非法的文件類型 102 echo 'Invalid file type.'; 103 } 104 } 105 }
調用方法以下所示:
1 $imageupload = new Imageupload(); 2 $options = array ( 3 'uploadDir' => 'demoPROJECT/uploads', 4 'fileTypes' => array('jpg', 'jpeg', 'png'), 5 'inputName' => 'file', 6 'fileName' => 'the_new_image', 7 'limit' => 'width', 8 'width' => 400, 9 'height' => 500, 10 'autoAdjust'=> false 11 ); 12 $imageupload->options($options); 13 $imageupload->execute();