本文实例讲述了PHP实现接收二进制流转换成图片的方法。分享给大家供大家参考,具体如下:
这里实现php 接收二进制流转换成图片,所使用的图片类imageUpload.php如下:
/** * 图片类 * @version 1.0 * * PHP默认只识别application/x-www.form-urlencoded标准的数据类型。 * 因此,对型如text/xml 或者 soap 或者 application/octet-stream 之类的内容无法解析,如果用$_POST数组来接收就会失败! * 故保留原型,交给$GLOBALS['HTTP_RAW_POST_DATA'] 来接收。 * 另外还有一项 php://input 也可以实现此这个功能 * php://input 允许读取 POST 的原始数据。和 $HTTP_RAW_POST_DATA 比起来,它给内存带来的压力较小,并且不需要任何特殊的 php.ini 设置。php://input和 $HTTP_RAW_POST_DATA 不能用于 enctype="multipart/form-data"。 */ classimageUpload { constROOT_PATH ='./'; constFAIL_WRITE_DATA ='Fail to write data'; //没有数据流 constNO_STREAM_DATA ='The post data is empty'; //图片类型不正确 constNOT_CORRECT_TYPE ='Not a correct image type'; //不能创建文件 constCAN_NOT_CREATE_FILE ='Can not create file'; //上传图片名称 public$image_name; //图片保存名称 public$save_name; //图片保存路径 public$save_dir; //目录+图片完整路径 public$save_fullpath; /** * 构造函数 * @param String $save_name 保存图片名称 * @param String $save_dir 保存路径名称 */ publicfunction__construct($save_name,$save_dir) { //set_error_handler ( $this->error_handler () ); //设置保存图片名称,若未设置,则随机产生一个唯一文件名 $this->save_name =$save_name?$save_name: md5 ( mt_rand (), uniqid () ); //设置保存图片路径,若未设置,则使用年/月/日格式进行目录存储 $this->save_dir =$save_dir? self::ROOT_PATH .$save_dir: self::ROOT_PATH .date('Y/m/d'); //创建文件夹 @$this->create_dir ($this->save_dir ); //设置目录+图片完整路径 $this->save_fullpath =$this->save_dir .'/'.$this->save_name; } //兼容PHP4 publicfunctionimage($save_name) { $this->__construct ($save_name); } publicfunctionstream2Image() { //二进制数据流 $data=file_get_contents('php://input') ?file_get_contents('php://input') : gzuncompress ($GLOBALS['HTTP_RAW_POST_DATA'] ); //数据流不为空,则进行保存操作 if(!empty($data)) { //创建并写入数据流,然后保存文件 if(@$fp=fopen($this->save_fullpath,'w+')) { fwrite ($fp,$data); fclose ($fp); $baseurl="http://".$_SERVER["SERVER_NAME"] .":".$_SERVER["SERVER_PORT"] . dirname ($_SERVER["SCRIPT_NAME"] ) .'/'.$this->save_name; if($this->getimageInfo ($baseurl)) { echo$baseurl; }else{ echo( self::NOT_CORRECT_TYPE ); } }else{ } }else{ //没有接收到数据流 echo( self::NO_STREAM_DATA ); } } /** * 创建文件夹 * @param String $dirName 文件夹路径名 */ publicfunctioncreate_dir($dirName,$recursive= 1,$mode=0777) { !is_dir($dirName) &&mkdir($dirName,$mode,$recursive); } /** * 获取图片信息,返回图片的宽、高、类型、大小、图片mine类型 * @param String $imageName 图片名称 */ publicfunctiongetimageInfo($imageName='') { $imageInfo=getimagesize($imageName); if($imageInfo!== false) { $imageType=strtolower(substr( image_type_to_extension ($imageInfo[2] ), 1 ) ); $imageSize=filesize($imageInfo); return$info=array('width'=>$imageInfo[0],'height'=>$imageInfo[1],'type'=>$imageType,'size'=>$imageSize,'mine'=>$imageInfo['mine'] ); }else{ //不是合法的图片 returnfalse; } } /*private function error_handler($a, $b) { echo $a, $b; }*/ } ?> |