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 编程请选择正确的文本编辑软件
Dec 21 PHP
PHP 字符截取 解决中文的截取问题,不用mb系列
Sep 29 PHP
php代码运行时间查看类代码分享
Aug 06 PHP
php 删除一个数组中的某个值.兼容多维数组!
Feb 18 PHP
php笔记之:数据类型与常量的使用分析
May 14 PHP
深入解析php之sphinx
May 15 PHP
php中利用str_pad函数生成数字递增形式的产品编号
Sep 30 PHP
PHP eval函数使用介绍
Dec 08 PHP
PHP获取MAC地址的具体实例
Dec 13 PHP
Zend Framework教程之请求对象的封装Zend_Controller_Request实例详解
Mar 07 PHP
使用ThinkPHP的自动完成实现无限级分类实例详解
Sep 02 PHP
Laravel框架源码解析之模型Model原理与用法解析
May 14 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脚本[带参数]的方法
2010/01/22 PHP
PHP sprintf()函数用例解析
2011/05/18 PHP
php空间不支持socket但支持curl时recaptcha的用法
2011/11/07 PHP
PHP获取用户访问IP地址的5种方法
2016/05/16 PHP
PHP+iframe图片上传实现即时刷新效果
2016/11/18 PHP
php 函数使用可变数量的参数方法
2017/05/02 PHP
用jquery来定位
2007/02/20 Javascript
jquery radio 操作代码
2011/03/16 Javascript
基于jquery的多彩百分比 动态进度条 投票效果显示效果实现代码
2011/08/28 Javascript
浅析Prototype的模板类 Template
2011/12/07 Javascript
js string 转 int 注意的问题小结
2013/08/15 Javascript
javascript中JSON对象与JSON字符串相互转换实例
2015/07/11 Javascript
JS实现具备延时功能的滑动门菜单效果
2015/09/17 Javascript
jquery模拟实现鼠标指针停止运动事件
2016/01/12 Javascript
Jquery zTree 树控件异步加载操作
2016/02/25 Javascript
jQuery获取某天的农历日期并判断是否除夕或新年的方法
2016/03/01 Javascript
Html中 IFrame的用法及注意点
2016/12/22 Javascript
element-ui 表格实现单元格可编辑的示例
2018/02/26 Javascript
微信小程序实现页面跳转传递参数(实体,对象)
2019/08/12 Javascript
js实现上传按钮并显示缩略图小轮子
2020/05/04 Javascript
JavaScript中的各种宽高属性的实现
2020/05/08 Javascript
微信小程序调用wx.getImageInfo遇到的坑解决
2020/05/31 Javascript
JS实现联想、自动补齐国家或地区名称的功能
2020/07/07 Javascript
[01:06]DOTA2小知识课堂 Ep.01 TP出门不要忘记帮队友灌瓶哦
2019/12/05 DOTA
Pycharm无法显示动态图片的解决方法
2018/10/28 Python
python基于C/S模式实现聊天室功能
2019/01/09 Python
django url到views参数传递的实例
2019/07/19 Python
Python‘==‘ 及 ‘is‘相关原理解析
2020/09/05 Python
js实现移动端H5页面手指滑动刻度尺功能
2017/11/16 HTML / CSS
全球最大的网上自行车商店:Chain Reaction Cycles
2016/12/02 全球购物
node中使用shell脚本的方法步骤
2021/03/23 Javascript
运动会邀请函范文
2014/01/31 职场文书
《登鹳雀楼》教学反思
2014/04/09 职场文书
2015年度党风廉政建设工作情况汇报
2015/01/02 职场文书
2015年税务稽查工作总结
2015/05/26 职场文书
董事长秘书工作总结
2015/08/14 职场文书