PHP实现接收二进制流转换成图片的方法

作者:袖梨 2022-06-24

本文实例讲述了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;

  }*/

}

?>

相关文章

精彩推荐