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


Posted in PHP onJanuary 10, 2017

本文实例讲述了PHP实现接收二进制流转换成图片的方法。分享给大家供大家参考,具体如下:

这里实现php 接收二进制流转换成图片,所使用的图片类imageUpload.php如下:

<?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"。
*/
class imageUpload {
  const ROOT_PATH = './';
  const FAIL_WRITE_DATA = 'Fail to write data';
  //没有数据流
  const NO_STREAM_DATA = 'The post data is empty';
  //图片类型不正确
  const NOT_CORRECT_TYPE = 'Not a correct image type';
  //不能创建文件
  const CAN_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 保存路径名称
   */
  public function __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
  public function image($save_name) {
    $this->__construct ( $save_name );
  }
  public function stream2Image() {
    //二进制数据流
    $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 文件夹路径名
   */
  public function create_dir($dirName, $recursive = 1,$mode=0777) {
    ! is_dir ( $dirName ) && mkdir ( $dirName,$mode,$recursive );
  }
  /**
   * 获取图片信息,返回图片的宽、高、类型、大小、图片mine类型
   * @param String $imageName 图片名称
   */
  public function getimageInfo($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 {
      //不是合法的图片
      return false;
    }
  }
  /*private function error_handler($a, $b) {
   echo $a, $b;
  }*/
}
?>
PHP 相关文章推荐
PHP学习之输出字符串(echo,print,printf,print_r和var_dump)
Apr 17 PHP
20个PHP常用类库小结
Sep 11 PHP
PHP 获取文件权限函数介绍
Jul 11 PHP
使用php测试硬盘写入速度示例
Jan 27 PHP
php文件服务实现虚拟挂载其他目录示例
Apr 17 PHP
php中explode函数用法分析
Nov 15 PHP
php表单提交与$_POST实例分析
Jan 26 PHP
php通过smtp邮件验证登陆的方法
May 11 PHP
PHP自定义函数格式化json数据示例
Sep 14 PHP
php实现保存周期为1天的购物车类
Jul 07 PHP
laravel-admin自动生成模块,及相关基础配置方法
Oct 08 PHP
laravel实现一个上传图片的接口,并建立软链接,访问图片的方法
Oct 12 PHP
ThinkPHP 模板substr的截取字符串函数详解
Jan 09 #PHP
php 访问oracle 存储过程实例详解
Jan 08 #PHP
微信开发之php表单微信中自动提交两次问题解决办法
Jan 08 #PHP
yii2-GridView在开发中常用的功能及技巧总结
Jan 07 #PHP
yii2实现分页,带搜索的分页功能示例
Jan 07 #PHP
Yii框架用户登录session丢失问题解决方法
Jan 07 #PHP
Yii框架表单提交验证功能分析
Jan 07 #PHP
You might like
php实现的九九乘法口诀表简洁版
2014/07/28 PHP
Symfony2中被遗弃的getRequest()方法分析
2016/03/17 PHP
PHP实现动态执行代码的方法
2016/03/25 PHP
微信公众号开发之语音消息识别php代码
2016/08/08 PHP
php传值方式和ajax的验证功能
2017/03/27 PHP
PHP基于Redis消息队列实现发布微博的方法
2017/05/03 PHP
ThinkPHP实现图片上传操作的方法详解
2017/05/08 PHP
Thinkphp5+uploadify实现的文件上传功能示例
2018/05/26 PHP
PHP如何根据文件头检测文件类型实例代码
2018/10/14 PHP
表单填写时用回车代替TAB的实现方法
2007/10/09 Javascript
利用Ext Js生成动态树实例代码
2008/09/08 Javascript
js 获取服务器控件值的代码
2010/03/05 Javascript
js操作XML文件的实现方法兼容IE与FireFox
2016/06/25 Javascript
懒加载实现的分页&amp;&amp;网站footer自适应
2016/12/21 Javascript
jquery对象与DOM对象转化
2017/02/08 Javascript
用jQuery旋转插件jqueryrotate制作转盘抽奖
2017/02/10 Javascript
ES6学习笔记之map、set与数组、对象的对比
2018/03/01 Javascript
nodejs异步编程基础之回调函数用法分析
2018/12/26 NodeJs
深入理解javascript中的this
2021/02/08 Javascript
[00:59]PWL开团时刻DAY7——我在赶
2020/11/06 DOTA
python3利用tcp实现文件夹远程传输
2018/07/28 Python
Python3的介绍、安装和命令行的认识(推荐)
2018/10/20 Python
Python中的单下划线和双下划线使用场景详解
2019/09/09 Python
在django-xadmin中APScheduler的启动初始化实例
2019/11/15 Python
Python通过两个dataframe用for循环求笛卡尔积
2020/04/29 Python
澳大利亚天然护肤品、化妆品和健康产品一站式商店:Nourished Life
2018/12/02 全球购物
SmartBuyGlasses德国:购买太阳镜和眼镜
2019/08/20 全球购物
非功能性需求都包括哪些方面
2013/10/29 面试题
旅游安全协议书
2014/04/21 职场文书
离婚协议书的书写要求
2014/09/17 职场文书
学习优秀共产党员先进事迹思想报告
2014/09/17 职场文书
2014年自愿离婚协议书范本
2014/09/25 职场文书
房屋租赁合同协议书范本
2014/10/19 职场文书
领导干部“四风”查摆问题个人整改措施
2014/10/28 职场文书
劳资员岗位职责
2015/02/13 职场文书
实习报告范文之电话客服岗位
2019/07/26 职场文书