php 实现图片上传并压缩功能

   前段时间由于项目需要,要实现图片上传并且压缩生成缩略图的功能。

接口代码如下:

 $allowext = array ( 'png', 'jpg', 'jpeg', 'gif','mp4','doc');

 $fileElement = 'file';

 $filepath_rel = 'userfiles/upload/chatfile/'.date("Ymd")."/"; // 相对路径

 //这里的$FILE_PATH 是网站的根目录

 $filepath_abs = $FILE_PATH . $filepath_rel; // 绝对路径

  if(!file_exists($filepath_abs))

  {  

    mkdir($filepath_abs,0777,true);  }



$fup = new FileUpload ( '100M', $allowext );
$r = $fup->upload ( $fileElement, $filepath_abs, '', true );
$name_abs = $filepath_abs . $r;
$name_rel = $filepath_rel . $r;
//图片等比例压缩
$pic =
$fup->getThumb($FILE_PATH,$name_rel,300,300);

 //upload 方法实现图片上传

 //参数$elename : file域的名称。<input type='file' name='elename'/>
 //$newname --上传以后的名字;可以为空。
 //$savepath --文件保存路径,一定要以 “/” 结尾。
 //$auto_rename 是否自动重命名
   //如果$newname 为空 且 auto_rename 为false ,将保留原来的文件名字
 function upload($elename, $savepath, $newname = '', $auto_rename = false){
  if(empty($_FILES[$elename])) throw new Exception('没有上传文件或文件大小超过系统限制', 981);

  $f_name = basename($_FILES[$elename]["name"]); //被上传文件的名称
  $f_type = $_FILES[$elename]["type"]; //被上传文件的类型
  $f_size = $_FILES[$elename]["size"]; //被上传文件的大小,以字节计
  $f_tmpname = $_FILES[$elename]["tmp_name"]; //存储在服务器的文件的临时副本的名称
  $f_error = $_FILES[$elename]["error"]; //由文件上传导致的错误代码

  //是否发生错误
  if($f_error) $this->uploadFileError($f_error);

  //文件后缀
  $f_ext = $this->getFileExt($f_name);

  //检查上传类型
  //--是否在禁止列表
  $forbidext = $this->forbidext;
  if(in_array($f_ext, $forbidext)) {
    throw new Exception('文件类型禁止上传', 901);
  }

  //--是否在允许列表
  $allowext = $this->allowext;
  if(!in_array($f_ext, $allowext)) {
    throw new Exception('文件类型未被允许', 902);
  }

  //文件大小是否允许
  $allowsize = $this->allowsize;
  if($f_size > $allowsize) {
    throw new Exception('文件超过允许的大小', 903);
  }

  //文件是否是上传的文件
  if(!is_uploaded_file($f_tmpname)) {
    throw new Exception('非上传的文件', 904);
  }

  //文件重命名 按时间命名 方便查看
  if(empty($newname) && $auto_rename)
    $new_name = $this->setFileNameByDate().'.'.$f_ext;
  elseif(!empty($newname))
    $new_name = $newname.'.'.$f_ext;
  else
    $new_name = $f_name;
  //保存文件
  $f_path = $savepath.$new_name;


  if(move_uploaded_file($f_tmpname, $f_path)){
    return $new_name;//上传成功,返回文件名。
    }else{
      throw new Exception('文件写入失败,请检查上传目录是否可写', 905);
    }
 }
  //生成一个日期命名的文件名
  private function setFileNameByDate(){
    return date('YmdHis').rand(1000,9999);
  }

完成了上传文件的功能接下来就要对这个文件进行压缩处理了。在这里用到了在脚本之家学习到的方法,做了一些改变。

function resizeImage($im, $dest, $maxwidth, $maxheight) {
  $img = getimagesize($im);
  switch ($img[2]) {
    case 1:
      $im = @imagecreatefromgif($im);
    break;
    case 2:
      $im = @imagecreatefromjpeg($im);
    break;
    case 3:
      $im = @imagecreatefrompng($im);
    break;
    }

    $pic_width = imagesx($im);
    $pic_height = imagesy($im);
    $resizewidth_tag = false;
    $resizeheight_tag = false;
  if (($maxwidth && $pic_width > $maxwidth) || ($maxheight && $pic_height > $maxheight)) {
    if ($maxwidth && $pic_width > $maxwidth) {
      $widthratio = $maxwidth / $pic_width;
      $resizewidth_tag = true;
    }

  if ($maxheight && $pic_height > $maxheight) {
    $heightratio = $maxheight / $pic_height;
    $resizeheight_tag = true;
  }

  if ($resizewidth_tag && $resizeheight_tag) {
    if ($widthratio < $heightratio)
      $ratio = $widthratio;
    else  
      $ratio = $heightratio;
   }


  if ($resizewidth_tag && !$resizeheight_tag)
    $ratio = $widthratio;
    if ($resizeheight_tag && !$resizewidth_tag)
    $ratio = $heightratio;
    $newwidth = $pic_width * $ratio;
    $newheight = $pic_height * $ratio;

  if (function_exists("imagecopyresampled")) {
    $newim = imagecreatetruecolor($newwidth, $newheight);
    imagecopyresampled($newim, $im, 0, 0, 0, 0, $newwidth, $newheight, $pic_width, $pic_height);
      } else {
    $newim = imagecreate($newwidth, $newheight);
    imagecopyresized($newim, $im, 0, 0, 0, 0, $newwidth, $newheight, $pic_width, $pic_height);
   }

  imagejpeg($newim, $dest);
  imagedestroy($newim);
    } else {
      imagejpeg($im, $dest);
    }
  }


function getThumb($public_path,$sFile,$iWidth,$iHeight){
  //图片公共路径 $public_path 这里改为有外部传入 根据具体情况进行修改

  //判断该图片是否存在
  if(!file_exists($public_path.$sFile)) return $sFile;
  //判断图片格式(图片文件后缀)
  $extend = explode("." , $sFile);
  $attach_fileext = strtolower($extend[count($extend) - 1]);
  if (!in_array($attach_fileext, array('jpg','png','jpeg'))){
    return '';
  }
  //压缩图片文件名称
  $sFileNameS = str_replace(".".$attach_fileext, "_".$iWidth.'_'.$iHeight.'.'.$attach_fileext, $sFile);
  //判断是否已压缩图片,若是则返回压缩图片路径
  if(file_exists($public_path.$sFileNameS)){
    return $sFileNameS;
  }

  //生成压缩图片,并存储到原图同路径下
  self::resizeImage($public_path.$sFile, $public_path.$sFileNameS, $iWidth, $iHeight);
  if(!file_exists($public_path.$sFileNameS)){
    return $sFile;
  }
  return $sFileNameS;
 }

这样上传的图片就按给定的width、height按相同比例压缩 这里resizeImage指定了最大的宽,高也可根据实际需求情况去调整。



 

转载于:https://www.cnblogs.com/cyworz/p/10565211.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/483869.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenAI 是如何被10亿美元收买了“非盈利”灵魂的?

来源&#xff1a;AI科技评论编译&#xff1a;陈彩娴、琰琰近日&#xff0c;一篇名为“How OpenAI Sold its Soul for $1 Billion”&#xff08;OpenAI是如何因为 10 亿美元出卖自己的灵魂&#xff09;的文章在 Reddit 上引起了热议。文章作者 Alberto Romero 抨击知名的非营利机…

传输速率、波特率、奈氏准则

波特率与传输速率 波特率与数据传输速率C的关系&#xff1a;CBlog2N N:为一个码元所取的离散值的个数。 408考研-2011-34 若某通信链路的数据传输速率为2400bps&#xff0c;采用四相位调制&#xff0c;则该链路的波特率是_____。 A.600波特 B.1200波特 C.4800波特 D.9600波特…

【算法】蓝桥杯dfs深度优先搜索之排列组合总结

【导航】 上一篇文章 → 《【算法】蓝桥杯dfs深度优先搜索之凑算式总结》 为了重申感谢之意&#xff0c;再次声明下文的大部分灵感均来自于【CSDN】梅森上校《JAVA版本&#xff1a;DFS算法题解两个例子&#xff08;走迷宫和求排列组合数&#xff09;》  强烈大家去上面那篇文…

人工神经网络能否驾驭生物神经元的“浓稠”程度?5到8层可能并非极限

来源&#xff1a;图灵人工智能编译&#xff1a;李扬霞编辑&#xff1a;青暮计算神经科学家通过训练人工神经网络来模仿生物神经元&#xff0c;提供了一种探讨单个脑细胞复杂性的新方法。虽然我们糊状的大脑似乎与计算机处理器中的芯片大相径庭&#xff0c;但科学家对两者的比较…

leaf 叶子(张量)

在pytorch的tensor类中,有个is_leaf的属性,姑且把它作为叶子节点. is_leaf 为False的时候,则不是叶子节点, is_leaf为True的时候为叶子节点(或者叶张量) 所以问题来了: leaf的作用是什么?为什么要加 leaf? 我们都知道tensor中的 requires_grad()属性&#xff0c;当requires_…

线性表——链表删除

王道链表题1-4 #include <iostream> #include <bits/stdc.h> using namespace std;typedef int Elemtype; //定义单链表 typedef struct Lnode{Elemtype data;struct Lnode *next; }Lnode,*Linklist; int a[4]{1,2,3,4}; int n4;//建立不带头节点的链表 void buil…

10个绕过反病毒的恶意用户技巧

原文&#xff1a;https://blog.netspi.com/10-evil-user-tricks-for-bypassing-anti-virus/ 介绍 译者注&#xff1a;很多不通顺的语句改掉了&#xff0c;还有反病毒解决方案统一翻译为了反病毒软件。无关紧要的话直接意思翻译 许多反病毒软件的部署配置方法较弱&#xff0c;为…

困扰爱因斯坦的「幽灵般的超距作用」,是如何被贝尔定理证明确实存在的?...

文章来源&#xff1a;机器之心作者&#xff1a;Ben Brubaker原文链接&#xff1a;https://www.quantamagazine.org/how-bells-theorem-proved-spooky-action-at-a-distance-is-real-20210720/我们理所当然地认为&#xff0c;世界上某个地方发生的一件事不会立即对远方的事物产生…

Jupyter notebook 导入和卸载 conda 虚拟环境

一、导入 进入Anaconda Prompt&#xff0c;激活要使用的虚拟环境。 conda activate xxx # 你要使用的虚拟环境名称安装 ipykernel 插件&#xff0c; 建议使用 pip 进行安装&#xff0c; conda 安装容易失败 pip install ipykernel安装完成之后&#xff0c;键入以下命令 pyt…

处理器管理与进程管理

4.python练习 1.观察父进程、子进程 2.观察进程运行状态 3。输入多个作业的作业编号&#xff0c;到达时间&#xff0c;所需CPU时间&#xff0c;形成列表&#xff0c;以备算法使用。 转载于:https://www.cnblogs.com/hclhechunlu/p/10580946.html

小白 LeetCode 242 有效的字母异位词

字母异位词 字符串由相同字母组成&#xff0c;但允许排列顺序不同。 如“aaabbb” 与 “ababab” 是字母异位词&#xff0c; 而“aabb” 与 “ab” 不是字母异位词。 题目&#xff1a;给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的字母异位词。 示例…

LSTM之父:吐槽了两年,来划划重点:“这5篇最高引论文都源于我们。”

来源&#xff1a;AI科技评论作者&#xff1a;陈彩娴编辑&#xff1a;青暮昨晚&#xff0c;“递归神经网络之父”Jrgen Schmidhuber 在推特上亲自发文&#xff0c;称目前引用数最高的5项神经网络工作都基于他的团队成果&#xff0c;一时引起了网友的广泛讨论。这并不是他首次发声…

初学者配置环境变量

1. 首先选择计算机右击&#xff0c;选择最后一个属性&#xff0c;进入属性面板 2. 点击“高级系统设置”&#xff0c;点击“环境变量” 3. 在“系统变量”的处配置所需要配置的环境变量&#xff0c;点击“新建”按钮 4. 配置java的环境变量 JAVA_HOME 、CLASSPATH 、 Path5. JA…

小白 LeetCode 5605 检查两个字符串数据是否相等

题目&#xff1a;给你两个字符串数组 word1 和 word2 。如果两个数组表示的字符串相同&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 数组表示的字符串 是由数组中的所有元素 按顺序 连接形成的字符串。 示例 1&#xff1a; 输入&#xff1a;word1 [&q…

Mac OS X下Maven的安装与配置

Mac OS X下Maven的安装与配置&#xff1a; 下载maven&#xff1a;https://maven.apache.org/download.cgi 打开Terminal,输入以下命令&#xff0c;设置Maven classpath&#xff0c;输入命令 vim ~/.bash_profile&#xff08;编辑环境变量配置文件&#xff09; MAVEN_HOME/…

演讲实录丨吴朝晖院士:从AI到CI——脑机智能的发展

来源&#xff1a;中国人工智能学会原创 &#xff1a;CAAI作者&#xff1a;吴朝晖院士吴朝晖中国科学院院士浙江大学校长IEEE/CAAI/CCF/CAA Fellow以下是吴朝晖院士的演讲实录&#xff1a;21世纪被称为“脑研究世纪”&#xff0c;伴随着脑科学和认知科学的兴起&#xff0c;特别是…

2019.3.23 捕获异常

PHP中try{}catch{}语句概述 1.PHP5添加了类似于其它语言的异常处理模块。在 PHP 代码中所产生的异常可被 throw语句抛出并被 catch 语句捕获。&#xff08;注&#xff1a;一定要先抛才能获取&#xff09; 2.需要进行异常处理的代码都必须放入 try 代码块内&#xff0c;以便捕获…

LeetCode 1480 一维数组的动态和

题目&#xff1a; 给你一个数组 nums 。数组「动态和」的计算公式为&#xff1a;runningSum[i] sum(nums[0]…nums[i]) 。 请返回 nums 的动态和。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3,4] 输出&#xff1a;[1,3,6,10] 解释&#xff1a;动态和计算过程为 [1,…

推荐系统简介

推荐系统简介 文章目录推荐系统简介1.推荐系统概述推荐系统目的我们推荐的目的&#xff1a;推荐系统的应用推荐系统的基本思想推荐系统的数据分析推荐系统分类2.推荐系统简介基于人口统计学的推荐基于内容的推荐基于协同过滤的推荐混合推荐3.推荐系统评测推荐系统的实验方法推荐…

清华大学孙茂松:透过喧嚣,坐看云起,NLP 的迷思与感悟

来源&#xff1a;智源社区图源&#xff1a;澎湃新闻2010年深层神经网络在语音识别研究方向上取得里程碑式进展&#xff0c;以这一事件为新起点和新动能&#xff0c;整个人工智能领域迅速跃迁到深度学习时代&#xff0c;包括自然语言处理&#xff08;NLP&#xff09;等关键领域也…