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 相关文章推荐
Apache, PHP在Windows 9x/NT下的安装与配置 (一)
Oct 09 PHP
PHP 文件类型判断代码
Mar 13 PHP
PHPMyadmin 配置文件详解(配置)
Dec 03 PHP
php HtmlReplace输入过滤安全函数
Jul 03 PHP
php array_intersect比array_diff快(附详细的使用说明)
Jul 03 PHP
PHP判断数据库中的记录是否存在的方法
Nov 14 PHP
ucenter通信原理分析
Jan 09 PHP
简单谈谈php中的unicode和utf8编码
Jun 10 PHP
php+mysql实现简单的增删改查功能
Jul 13 PHP
百度地图API使用方法详解
Aug 25 PHP
PHP 微信支付类 demo
Nov 30 PHP
php版本CKEditor 4和CKFinder安装及配置方法图文教程
Jun 05 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
第十一节 重载 [11]
2006/10/09 PHP
PHP 日常开发小技巧
2009/09/23 PHP
php检索或者复制远程文件的方法
2015/03/13 PHP
Yii2简单实现给表单添加验证码的方法
2016/07/18 PHP
实现php删除链表中重复的结点
2018/09/27 PHP
IE6,IE7下js动态加载图片不显示错误
2010/07/17 Javascript
Jquery中的$.each获取各种返回类型数据的使用方法
2015/05/03 Javascript
JavaScript中的fontsize()方法使用详解
2015/06/08 Javascript
JS中多步骤多分步的StepJump组件实例详解
2016/04/01 Javascript
使用JS轻松实现ionic调用键盘搜索功能(超实用)
2016/09/06 Javascript
微信+angularJS的SPA应用中用router进行页面跳转,jssdk校验失败问题解决
2016/09/09 Javascript
webpack手动配置React开发环境的步骤
2018/07/02 Javascript
vue.js单文件组件中非父子组件的传值实例
2018/09/13 Javascript
JavaScript 接口原理与用法实例详解
2020/05/12 Javascript
nuxt.js写项目时增加错误提示页面操作
2020/11/05 Javascript
Python打印斐波拉契数列实例
2015/07/07 Python
Python爬虫之pandas基本安装与使用方法示例
2018/08/08 Python
python 利用文件锁单例执行脚本的方法
2019/02/19 Python
详解Python3注释知识点
2019/02/19 Python
详解python读取和输出到txt
2019/03/29 Python
Django MEDIA的配置及用法详解
2019/07/25 Python
解决使用python print打印函数返回值多一个None的问题
2020/04/09 Python
python+selenium+chromedriver实现爬虫示例代码
2020/04/10 Python
Python爬虫HTPP请求方法有哪些
2020/06/03 Python
keras实现VGG16 CIFAR10数据集方式
2020/07/07 Python
Python浮点型(float)运算结果不正确的解决方案
2020/09/22 Python
前端实现打印图像功能
2019/08/27 HTML / CSS
读书之星事迹材料
2014/05/12 职场文书
个人工作作风整改措施思想汇报
2014/10/13 职场文书
小学中等生评语
2014/12/29 职场文书
长城导游词
2015/01/30 职场文书
2015年工程师工作总结
2015/04/30 职场文书
《雪地里的小画家》教学反思
2016/02/16 职场文书
《观察物体》教学反思
2016/02/17 职场文书
Laravel中获取IP的真实地理位置
2021/04/01 PHP
使用Java去实现超市会员管理系统
2022/03/18 Java/Android