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 相关文章推荐
Zend公司全球首推PHP认证
Oct 09 PHP
PHP无刷新上传文件实现代码
Sep 19 PHP
PHP代码网站如何防范SQL注入漏洞攻击建议分享
Mar 01 PHP
php文字水印和php图片水印实现代码(二种加水印方法)
Dec 25 PHP
纯PHP生成的一个树叶图片画图例子
Apr 16 PHP
PHP5中实现多态的两种方法实例分享
Apr 21 PHP
php针对cookie操作的队列操作类实例
Dec 10 PHP
PHP中使用imagick实现把PDF转成图片
Jan 26 PHP
php实现两个数组相加的方法
Feb 17 PHP
PHP图像处理类库及演示分享
May 17 PHP
CI配置多数据库访问的方法
Mar 28 PHP
实现laravel 插入操作日志到数据库的方法
Oct 11 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中获取文件扩展名的N种方法小结
2012/02/27 PHP
PHP上传图片进行等比缩放可增加水印功能
2014/01/13 PHP
PHP编程中的Session阻塞问题与解决方法分析
2017/08/07 PHP
createElement动态创建HTML对象脚本代码
2008/11/24 Javascript
简洁短小的 JavaScript IE 浏览器判定代码
2010/03/21 Javascript
JavaScript表达式:URL 协议介绍
2013/03/10 Javascript
通过action传过来的值在option获取进行验证的方法
2013/11/14 Javascript
浅谈JS中逗号运算符的用法
2016/06/12 Javascript
js添加千分位的实现代码(超简单)
2016/08/01 Javascript
简单谈谈Javascript函数中的arguments
2017/02/09 Javascript
解决vue router组件状态刷新消失的问题
2018/08/01 Javascript
浅谈React之状态(State)
2018/09/19 Javascript
axios携带cookie配置详解(axios+koa)
2018/12/28 Javascript
Python去除列表中重复元素的方法
2015/03/20 Python
以Python的Pyspider为例剖析搜索引擎的网络爬虫实现方法
2015/03/30 Python
编写同时兼容Python2.x与Python3.x版本的代码的几个示例
2015/03/30 Python
python自动查询12306余票并发送邮箱提醒脚本
2018/05/21 Python
Django中使用Celery的教程详解
2018/08/24 Python
Python实现二叉树的常见遍历操作总结【7种方法】
2019/03/06 Python
python面试题之列表声明实例分析
2019/07/08 Python
基于python3 的百度图片下载器的实现代码
2019/11/05 Python
英国女性运动服品牌:Sweaty Betty
2018/11/08 全球购物
千禧酒店及度假村官方网站:Millennium Hotels and Resorts
2019/05/10 全球购物
专科文秘应届生求职信
2013/11/18 职场文书
物业电工岗位职责
2013/11/20 职场文书
师范毕业生个人求职信
2013/12/09 职场文书
集团薪酬管理制度
2014/01/13 职场文书
邮政员工辞职信
2014/01/16 职场文书
消防应急演练方案
2014/02/12 职场文书
高中竞选班长演讲稿
2014/04/24 职场文书
教室布置标语
2014/06/26 职场文书
公司人事专员岗位职责
2014/08/11 职场文书
2014年设备管理工作总结
2014/11/26 职场文书
2016年校园社会综合治理宣传月活动总结
2016/03/16 职场文书
go语言中fallthrough的用法说明
2021/05/06 Golang
详解Flutter网络请求Dio库的使用及封装
2022/04/14 Java/Android