基本上如今的各类网站都会涉及到图片上传,所以有一个适应性强的图片上传标准化类库是有必要的。该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();