编辑器上传图片至七牛,处理(裁剪,缩放)图片后上传,不落地

来源:互联网 发布:淘宝客自动采集漏洞 编辑:程序博客网 时间:2024/04/30 11:06
很多网站系统为了节省自身服务器空间,会将资源文件存储在第三方,这样很方面,只是存储空间需要收费的,如果用户上传过大图片会占用很多空间,然后显示也不需要调用原文件。
最近遇到一个关于这方面的问题,公司要求像素大于1000*1000的图片要进行裁剪,然后上传到七牛,像素超过1000的要裁剪为1000的,小于1000的直接上传原图。
看过七牛的文档,虽然有对大图片进行高级处理的v2版的说明,但是这些处理都是已经存储在七牛上的了。
看sdk中src/Qiniu/Storage/UploadManager.php中有put和putFile两个上传文件的方法,前者是上传二进制流,后者是上传文件(原理也是转成二进制)。
putFile:思路大概是降图片做完裁剪然后存放自身服务器上,然后将裁剪后的图片地址路径上传,上传成功后再将自身服务器上的资源删掉。我没有用这个方法,总觉得落地数据处理不舒服。
put:思路是将图片裁剪之后,将裁剪后的图片生成二进制流存放在缓存中,然后将缓存中的二进制调用put上传。

Talk is cheap. Show you the code。

裁剪图片,并返回裁剪后的图片二进制

/** * 上传图片处理 原图像素大于1000*1000的处理 * $maxwidth = 1000 * $maxheight = 1000 */function resizeImage($im,$maxwidth=1000,$maxheight=1000){$pic_width = imagesx($im);$pic_height = imagesy($im);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);}//不写入服务ob_start(); //开启缓存imagejpeg($newim);$erjinzhi = ob_get_clean(); //获取二进制return $erjinzhi; //返回二进制}else{ //像素没超过规定范围,返回原图二进制ob_start();imagejpeg($im);$erjinzhi = ob_get_clean();return $erjinzhi;}}
以下是调用七牛sdk上传二进制至服务器

$imageresource =  'J:\wamp\tmp\php8D3.tmp' ;//上传图片的临时文件或本地图片路径$imgFile = $this->resizeImage($imageresource);//像素大于1000*1000的前期处理后上传// 上传到七牛后保存的文件名$time = md5(microtime().rand(1000,9999));$name = substr($time, 0, 2) .'/'. substr($time, 2, 2) .'/'. $time;$key = 'bbs/'.$name.'.jpg'; //上传后的文件命名// 初始化 UploadManager 对象并进行文件的上传$uploadMgr = new UploadManager();// 调用 UploadManager 的 put 方法进行文件的上传list($ret, $err) = $uploadMgr->put($token, $key, $imgFile);

以上是jpg静态图的上传方式,可根据传图属性分别使用imagejpeg() imagebmp() imagepng()不同方法。

如果gif上传也用以上方法的话,gif被裁剪后的结果只会保留gif的第一帧,也就是说裁剪后的gif是不会动的静态图,gif上传可直接使用七牛的UploadManager的putFile()直接上传。跳过裁剪过程。