基本上现在的各种网站都会涉及到图片上传,因此有一个适应性强的图片上传标准化类库是有必要的。该Class可以根据网站具体要求,通过一组自定义参数将图片尺寸按下述方式进行调整并上传到指定路径。

该类可以实现如下要求:

1. 我只需要关注图片宽度,例如微博人人等社交网站或照片流模式网站上的图片(limit='width'):当宽度大于规定值时,图片宽度重置至规定值,同时高度等比自适应;默认情况下,如果上传的图片宽度小于规定值,也将按此方式调整,您可以设置'autoAdjust'=false 来停用该功能。

2. 我只需要关注图片高度,例如当相册预览时想保证横向图片列表的规则性(limit='height'):当高度大于规定值时,图片高度重置至规定值,同时宽度等比自适应;默认情况下,如果上传的图片高度小于规定值,也将按此方式调整,您可以设置'autoAdjust'=false 来停用该功能。

3. 我希望图片的宽度和高度都不能超过规定值(limit='both'):此时,函数会自动判断图片宽高比,并保证图片的宽或高都不超过期望值。此时您仍可以设置'autoAdjust'=false 来停用对宽或高都小于规定值的图片的自动放大功能。

4. 不对图片尺寸做任何调整(limit=false): 此时,图片会按照原尺寸保存到指定的目录下。

参数及其默认值:

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 //小于期望尺寸的图片是否自适应扩大到规定尺寸

返回值:

目前常采用ajax的方式来进行上传或者获取返回信息,因此在类的最后采用了简单的json形式的输出:

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();

转载于:https://www.cnblogs.com/huangpu/p/3185869.html

可实现自动设置尺寸的图片上传类相关推荐

  1. base64图裁剪 php_php图片上传类(支持缩放、裁剪、图片缩略功能)

    namespace dollarphp; /** * @desc:图片上传类 * @author [Lee] ]> * 1.自动验证文件是表单提交的文件还是base64流提交的文件 * 2.验证 ...

  2. php上传图片限制类型,php,_使用php的图片上传类进行图片上传,总是提示:上传文件时出错 : 未允许类型 。都是默认的配置,php - phpStudy...

    使用php的图片上传类进行图片上传,总是提示:上传文件时出错 : 未允许类型 .都是默认的配置 使用php的图片上传类进行图片上传,总是提示:上传文件时出错 : 未允许类型 .都是默认的配置 $upl ...

  3. 单文件图片管理php,php封装的单文件(图片)上传类完整实例

    本文实例讲述了php封装的单文件(图片)上传类.分享给大家供大家参考,具体如下: //封装php中的单文件(图片)上传类 /* //参数1:$file 文件数组 5个属性值 name,type,siz ...

  4. php单文件上传实例,php封装的单文件(图片)上传类完整实例

    本文实例讲述了php封装的单文件(图片)上传类.分享给大家供大家参考,具体如下: //封装php中的单文件(图片)上传类 /* //参数1:$file 文件数组 5个属性值 name,type,siz ...

  5. 【Typora图床设置】Typora图片上传和阿里云OSS对象存储

    问题描述 因为Typora是纯文本编辑器,所以无法导入图片,但是可以显示图片.换句话说,Typora文档中保存的图片实际上是图片的存储地址,Typora会根据这个地址来显示图片.我们在使用Typora ...

  6. 阿里云OSS图片上传类

    1.阿里云基本函数 /*** 把本地变量的内容到文件* 简单上传,上传指定变量的内存值作为object的内容*/ public function putObject($imgPath,$object) ...

  7. PHP 图片上传类 缩略图

    为什么80%的码农都做不了架构师?>>>    <?PHP /** * 上传图片 */ class imgUpload{static protected $a;protecte ...

  8. asp.Net_图片上传的一个类库的源码

    一般情况.图片是不直接存到数据库的.而只是存了图片的名称. 存放图片的文件夹路径一般是固定的. 所以这时你只需要从数据库拿出图片名称.直接在页面中这么写就OK了:<img src="y ...

  9. php上传图片并显示代码,php图片上传代码(完整版已测试)

    php图片上传代码本来是一个很简单的事,之前笔者图省事,直接网上下载了一个php图片上传小程序,结果导致wordpress网站被黑,因为留有后门,后来排查直接删除整个小程序,自己用重新写了一个php图 ...

最新文章

  1. consolel API大全-附测试结果
  2. mysql 压缩表_MySQL InnoDB 表压缩(行格式压缩)
  3. java pc计数器_java虚拟机-程序计数器PC Register
  4. selenium以及chromdrive安装
  5. springmvc跳转html_SpringMVC基础(三)
  6. WordPress文章ajax,使用ajax在WordPress后台删除文章方法
  7. js用递归遍历多维数组_JavaScript树结构操作:查找、遍历、筛选、树结构和列表结构相互转换...
  8. python web性能不如php_Python比PHP更加适合网络开发的原因
  9. DOS命令行使用pscp实现远程文件和文件夹传输(转)
  10. 单片机七阶音符_单片机教程二十七:单片机音乐程序设计(含源程序)
  11. 支付宝接口调用出现INVALID_PARAMETER错误,订单信息无法识别
  12. 鲁大师11月新机排行:只有5款机型发布,OPPO撑起榜单
  13. jvm 内存模型结构
  14. 海地PVC/COC认证
  15. shiro for example: not eligible for auto-proxying
  16. 计算机专业实验记录本,实验记录本填写规范,拿走不谢!
  17. 计算机如何将01转化为高低电平
  18. kali实施文件上传漏洞攻击:
  19. 深度学习的典型应用和挑战及未来
  20. 277套自动输送线图纸输送机链板流水线倍速链皮带线SW机械设计

热门文章

  1. 进阶篇-安卓系统:5.安卓手机位置传感器
  2. Android开发中的svn问题
  3. [转]多线程更新Processbar
  4. 通过100个单词掌握英语语法(四十四)more
  5. 【Spring】依赖注入 加载顺序
  6. 需求实在太旺盛,三星电子考虑扩大在华芯片产能
  7. Oracle Q-quote delimiter Quote(q) 字符串原样输出
  8. asp.net faq: 在html文件中,用js获取session
  9. MySQL5.6 Performance_schema
  10. android 自定义MP4播放器