thinkphp 实现文件上传并按照指定大小压缩
问题需求:是微信小程序,客户端上传现场执法检查的图片(拍照)到服务器,然后服务器根据上传的数据生成pdf文件后台下载存档。那么问题来了,现在的手机分辨率比较高,拍一个照片动不动就5M起,一个检查下来上传最少20张图片,这下可好,我生成pdf的时候直接卡死。
方案1:小程序端有设置上传照片是原图上传还是压缩后上传,当然当时选的是压缩后上传,但是还是反应有pdf不能下载,原因就是图片多,文件大导致。后来发现,Android手机小程序上传图片压缩后很小 640px 而IOS手机上传的图片压缩之后也非常大2-4M都有,导致问题是苹果手机上传的检查数据不能生成pdf。
方案2:上传上来的图片不管你是什么手机上传来的 我直接判断图片宽度超过640px就压缩。这样你小程序不管你上传的是多么清楚的照片我都不管统统压缩到640px一下。这样生成pdf文档压力就不会致死了。
下面是代码保存记录:
if(IS_POST) {
$savepath='./'.date('Ymd') .'/';
//上传处理类
$config=array(
'rootPath'=>'./'. C("UPLOADPATH"),
'savePath'=>$savepath,
'maxSize'=>2*1024*1024,
'saveName'=>array('uniqid',''),
'exts'=>array('jpg','gif','png','jpeg'),
'autoSub'=>false,
);
$upload=new\Think\Upload($config);//
$info=$upload->upload();
//开始上传
if($info) {
$oriName=$_FILES['file']['name'];
$first=array_shift($info);
$url= C("TMPL_PARSE_STRING.__UPLOAD__") .$savepath.$first['savename'];
$preview_url=$url;
$filepath=$savepath.$first['savename'];
$image=new\Think\Image();
$image->open(".".$url);
if($image->width() >640||$image->height() >640) {
$image->thumb(640,640);
}
//添加水印 地址和时间
$image->text($address."\n".date("Y年m月d日"),'./public/msyh.ttf',14,'#ffffff', \Think\Image::IMAGE_WATER_NORTHWEST,"10");
$image->save('./'.$preview_url);
$this->ajaxReturn(array('preview_url'=>$preview_url,'filepath'=>$filepath,'url'=>$url,'name'=>$oriName,'status'=>1,'message'=>'success'));
}else{
$this->ajaxReturn(array('name'=>'','status'=>0,'message'=>$upload->getError()));
}
}