手机app以数据流格式传图片php接受并保存服务器

今天接到一个任务需要将手机app传过来的二进制数据流图片以文件格式保存到服务器上,这是第一次做这种需求,就度娘一下,看见有些大神一些好了一个image类,就拿下来学习,修改一下应用到项目中。经研究学习发现这个类是可以实现需要的。特在次再做一下说明。

  1. /** 
  2.  * 图片类 
  3.  * @author [email protected] 
  4.  * @version 1.0 
  5.  * 

    PHP默认只识别application/x-www.form-urlencoded标准的数据类型。
    因此,对型如text/xml 或者 soap 或者 application/octet-stream 之类的内容无法解析,如果用$_POST数组来接收就会失败!
    故保留原型,交给$GLOBALS['HTTP_RAW_POST_DATA'] 来接收。在手机app传过来时没有涉及到浏览器所以此处取不到$GLOBALS['HTTP_RAW_POST_DATA'] 。要用 php://input实现。

    另外还有一项 php://input 也可以实现此这个功能

    php://input 允许读取 POST 的原始数据。和 $HTTP_RAW_POST_DATA 比起来,它给内存带来的压力较小,并且不需要任何特殊的 php.ini 设置。php://input和 $HTTP_RAW_POST_DATA 不能用于 enctype="multipart/form-data"。

  1.  */  
  2. class image {  
  3.     const ROOT_PATH = './';  
  4.     const FAIL_WRITE_DATA = 'Fail to write data';  
  5.     //没有数据流  
  6.     const NO_STREAM_DATA = 'The post data is empty';  
  7.     //图片类型不正确  
  8.     const NOT_CORRECT_TYPE = 'Not a correct image type';  
  9.     //不能创建文件  
  10.     const CAN_NOT_CREATE_FILE = 'Can not create file';  
  11.     //上传图片名称  
  12.     public $image_name;  
  13.     //图片保存名称  此处名称需要含有后缀名才可实现图片保存功能,否则不是图片。
  14.     public $save_name;  
  15.     //图片保存路径  
  16.     public $save_dir;  
  17.     //目录+图片完整路径  
  18.     public $save_fullpath;  
  19.       
  20.     /** 
  21.      * 构造函数 
  22.      * @param String $save_name 保存图片名称 
  23.      * @param String $save_dir 保存路径名称 
  24.      */  
  25.     public function __construct($save_name$save_dir) {  
  26.         //set_error_handler ( $this->error_handler () );  
  27.           
  28.         //设置保存图片名称,若未设置,则随机产生一个唯一文件名  
  29.         $this->save_name = $save_name ? $save_name : md5 ( mt_rand (), uniqid () );  
  30.         //设置保存图片路径,若未设置,则使用年/月/日格式进行目录存储  
  31.         $this->save_dir =  $save_dir ? self::ROOT_PATH .$save_dir : self::ROOT_PATH .date ( 'Y/m/d' );  
  32.            
  33.         //创建文件夹  
  34.         @$this->create_dir ( $this->save_dir );  
  35.         //设置目录+图片完整路径  
  36.         $this->save_fullpath = $this->save_dir . '/' . $this->save_name;  
  37.     }  
  38.     //兼容PHP4  
  39.     public function image($save_name) {  
  40.         $this->__construct ( $save_name );  
  41.     }  
  42.       
  43.     public function stream2Image() {  
  44.         //二进制数据流  
  45.         $data = file_get_contents ( 'php://input' ) ? file_get_contents ( 'php://input' ) : gzuncompress ( $GLOBALS ['HTTP_RAW_POST_DATA'] );  
  46.         //数据流不为空,则进行保存操作  
  47.         if (! emptyempty ( $data )) {  
  48.             //创建并写入数据流,然后保存文件  
  49.             if (@$fp = fopen ( $this->save_fullpath, 'w+' )) {  
  50.                 fwrite ( $fp$data );  
  51.                 fclose ( $fp );  
  52.                 $baseurl = "http://" . $_SERVER ["SERVER_NAME"] . ":" . $_SERVER ["SERVER_PORT"] . dirname ( $_SERVER ["SCRIPT_NAME"] ) . '/' . $this->save_name;                  
  53.                 if ( $this->getimageInfo ( $baseurl )) {  
  54.                     echo $baseurl;  
  55.                 } else {  
  56.                     echo ( self::NOT_CORRECT_TYPE  );  
  57.                 }  
  58.             } else {  
  59.               
  60.             }  
  61.         } else {  
  62.             //没有接收到数据流  
  63.             echo ( self::NO_STREAM_DATA );  
  64.         }  
  65.     }  
  66.     /** 
  67.      * 创建文件夹 
  68.      * @param String $dirName 文件夹路径名 
  69.      */  
  70.     public function create_dir($dirName$recursive = 1,$mode=0777) {  
  71.         ! is_dir ( $dirName ) && mkdir ( $dirName,$mode,$recursive );  
  72.     }  
  73.     /** 
  74.      * 获取图片信息,返回图片的宽、高、类型、大小、图片mine类型 
  75.      * @param String $imageName 图片名称 
  76.      */  
  77.     public function getimageInfo($imageName = '') {  
  78.         $imageInfo = getimagesize ( $imageName );  
  79.         if ($imageInfo !== false) {  
  80.             $imageType = strtolower ( substr ( image_type_to_extension ( $imageInfo [2] ), 1 ) );  
  81.             $imageSize = filesize ( $imageInfo );  
  82.             return $info = array ('width' => $imageInfo [0], 'height' => $imageInfo [1], 'type' => $imageType'size' => $imageSize'mine' => $imageInfo ['mine'] );  
  83.         } else {  
  84.             //不是合法的图片  
  85.             return false;  
  86.         }  
  87.       
  88.     }  
  89.       
  90.     /*private function error_handler($a, $b) { 
  91.         echo $a, $b; 
  92.     }*/  
  93.   
  94. }  
此篇文章只是用于自己保存学习,分享一下。不是纯原创。
2014.08.14

你可能感兴趣的:(手机app以数据流格式传图片php接受并保存服务器)