问题需求:是微信小程序,客户端上传现场执法检查的图片(拍照)到服务器,然后服务器根据上传的数据生成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()));
   }
}