本文是基于PHP+laravel实现各种情况的图片上传+压缩 话不多说直接上代码
富文本编辑器上传
//富文本编辑器上传图片
public function uploadImg(Request $request){
$fileInfo = $_FILES['files'];
$file_path = './upload/'. date("Y") .'/'. date("m") . '/' .date('d');
if(!is_dir($file_path)){
mkdir($file_path,0777,true);
}
$filename=$fileInfo["tmp_name"];
$image_size = getimagesize($filename);
$pinfo=pathinfo($fileInfo["name"]);
$ftype=$pinfo['extension'];
$file_name = date('YmdHis',time()).mt_rand(1000,9999) . '.' . $ftype ;
$destination = $file_path.'/'.$file_name;
if(move_uploaded_file ($filename, $destination))
{
$new_path = '域名'.substr($file_path,1) .'/'. $file_name;
$dst_img = '1111111'. '.' . $ftype;//保存图片的文件名
$percent = 1; #原图压缩,不缩放,但体积大大降低
$imgcom=new imgcompressController($new_path,$percent);
$result=$imgcom->compressImg($dst_img);
$path = 'https://dy.bjzhishanzhimei.com'.'/'.$dst_img;
if(empty($result)){
if(copy ($dst_img, $destination))
{
unlink($dst_img);
return $this->resultHandler('上传成功',true,$new_path,'10000');
}else{
return $this->resultHandler('上传失败',false,false,'999');
}
}else{
return $this->resultHandler('上传成功',true,$new_path,'10000');
}
}
}
base64格式:
//传入Base64图片
public static function upFile($file){
if(!empty($file)){
if(!preg_match('/^(data:\s*image\/(\w+);base64,)/', $file, $result)){
throw new ParameterException([
'msg' => '编码错误'
]);
}
$type = $result[2];
if (strstr($file,",")){
$image = explode(',',$file);
$file = $image[1];
}
$file_name = date('YmdHis',time()).mt_rand(1000,9999) . '.' . $type ;
$file_path = './upload/'. date("Y") .'/'. date("m") . '/' .date('d');
$imageSrc= $file_path."/". $file_name;
if(!is_dir($file_path)){
mkdir($file_path,0777,true);
}
file_put_contents($imageSrc, base64_decode($file));
$new_path = '域名'.substr($file_path,1) .'/'. $file_name;
$dst_img = '2.jpg';//保存图片的文件名
$percent = 1; #原图压缩,不缩放,但体积大大降低
$imgcom=new imgcompressController($new_path,$percent);
$result=$imgcom->compressImg($dst_img);
$path = 'https://dy.bjzhishanzhimei.com'.'/'.$dst_img;
if(empty($result)){
if(copy ($dst_img, $imageSrc)) //copy图片到指定位置
{
unlink($dst_img); //copy成功后删除该图片
return $new_path;
}else{
return $new_path;
}
}else{
return $new_path;
}
}
}
imgcompressController文件:
class imgcompressController extends BaseController
{
private $src;
private $image;
private $imageinfo;
private $percent = 0.5;
/**
* 图片压缩
* @param $src 源图
* @param float $percent 压缩比例
*/
public function __construct($src, $percent=1)
{
$this->src = $src;
$this->percent = $percent;
}
/** 高清压缩图片
* @param string $saveName 提供图片名(可不带扩展名,用源图扩展名)用于保存。或不提供文件名直接显示
*/
public function compressImg($saveName='')
{
$this->_openImage();
if(!empty($saveName)) $this->_saveImage($saveName); //保存
else $this->_showImage();
}
/**
* 内部:打开图片
*/
private function _openImage()
{
list($width, $height, $type, $attr) = getimagesize($this->src);
$this->imageinfo = array(
'width'=>$width,
'height'=>$height,
'type'=>image_type_to_extension($type,false),
'attr'=>$attr
);
$fun = "imagecreatefrom".$this->imageinfo['type'];
$this->image = $fun($this->src);
$this->_thumpImage();
}
/**
* 内部:操作图片
*/
private function _thumpImage()
{
$new_width = $this->imageinfo['width'] * $this->percent;
$new_height = $this->imageinfo['height'] * $this->percent;
$image_thump = imagecreatetruecolor($new_width,$new_height);
//将原图复制带图片载体上面,并且按照一定比例压缩,极大的保持了清晰度
imagecopyresampled($image_thump,$this->image,0,0,0,0,$new_width,$new_height,$this->imageinfo['width'],$this->imageinfo['height']);
imagedestroy($this->image);
$this->image = $image_thump;
}
/**
* 输出图片:保存图片则用saveImage()
*/
private function _showImage()
{
header('Content-Type: image/'.$this->imageinfo['type']);
$funcs = "image".$this->imageinfo['type'];
$funcs($this->image);
}
/**
* 保存图片到硬盘:
* @param string $dstImgName 1、可指定字符串不带后缀的名称,使用源图扩展名 。2、直接指定目标图片名带扩展名。
*/
private function _saveImage($dstImgName)
{
if(empty($dstImgName)) return false;
$allowImgs = ['.jpg', '.jpeg', '.png', '.bmp', '.wbmp','.gif']; //如果目标图片名有后缀就用目标图片扩展名 后缀,如果没有,则用源图的扩展名
$dstExt = strrchr($dstImgName ,".");
$sourseExt = strrchr($this->src ,".");
if(!empty($dstExt)) $dstExt =strtolower($dstExt);
if(!empty($sourseExt)) $sourseExt =strtolower($sourseExt);
//有指定目标名扩展名
if(!empty($dstExt) && in_array($dstExt,$allowImgs)){
$dstName = $dstImgName;
}elseif(!empty($sourseExt) && in_array($sourseExt,$allowImgs)){
$dstName = $dstImgName.$sourseExt;
}else{
$dstName = $dstImgName.$this->imageinfo['type'];
}
$funcs = "image".$this->imageinfo['type'];
$funcs($this->image,$dstName);
}
/**
* 销毁图片
*/
public function __destruct(){
imagedestroy($this->image);
}
}
记得使用该类之前先引入!!!!