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 相关文章推荐
PHP5 安装方法
Oct 09 PHP
用DBSQL类加快开发MySQL数据库程序的速度
Oct 09 PHP
利用php递归实现无限分类 格式化数组的详解
Jun 08 PHP
php处理restful请求的路由类分享
Feb 27 PHP
CodeIgniter框架URL路由总结
Sep 03 PHP
PHP实现Soap通讯的方法
Nov 03 PHP
php简单实现屏蔽指定ip段用户的访问
Apr 29 PHP
PHP使用内置函数生成图片的方法详解
May 09 PHP
php如何实现不借助IDE快速定位行数或者方法定义的文件和位置
Jan 17 PHP
thinkPHP实现签到功能的方法
Mar 15 PHP
实例讲解PHP页面静态化
Feb 05 PHP
简单实用的PHP文本缓存类实例
Mar 22 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
第十四节 命名空间 [14]
2006/10/09 PHP
php 随机排序广告的实现代码
2011/05/09 PHP
destoon供应信息title调用出公司名称的方法
2014/08/22 PHP
JQuery1.8 判断元素是否绑定事件的方法
2014/07/10 Javascript
jQuery实现个性翻牌效果导航菜单的方法
2015/03/09 Javascript
推荐10 款 SVG 动画的 JavaScript 库
2015/03/24 Javascript
javascript Array 数组常用方法
2015/04/05 Javascript
谈谈我对JavaScript中typeof和instanceof的深入理解
2015/12/25 Javascript
AngularJS入门教程之双向绑定详解
2016/08/18 Javascript
JavaScript每天必学之事件
2016/09/18 Javascript
前端常见跨域解决方案(全)
2017/09/19 Javascript
nodejs实现大文件(在线视频)的读取
2020/10/16 NodeJs
jQuery实现的简单获取索引功能示例
2018/06/04 jQuery
vue实现引入本地json的方法分析
2018/07/12 Javascript
jQuery实现基本动画效果的方法详解
2018/09/06 jQuery
nodejs实现用户登录路由功能
2019/05/22 NodeJs
在Node.js中将SVG图像转换为PNG,JPEG,TIFF,WEBP和HEIF格式的方法
2019/08/22 Javascript
解决vue addRoutes不生效问题
2020/08/04 Javascript
python 文件和路径操作函数小结
2009/11/23 Python
Python使用PIL库实现验证码图片的方法
2016/03/11 Python
python应用文件读取与登录注册功能
2019/09/23 Python
Python object类中的特殊方法代码讲解
2020/03/06 Python
Python的in,is和id函数代码实例
2020/04/18 Python
Python Tornado核心及相关原理详解
2020/06/24 Python
如何利用Python给自己的头像加一个小国旗(小月饼)
2020/10/02 Python
用css3实现转换过渡和动画效果
2020/03/13 HTML / CSS
HTML5实现移动端复制功能
2018/04/19 HTML / CSS
大都会艺术博物馆商店:The Met Store
2018/06/22 全球购物
大专毕业生自我评价分享
2013/11/10 职场文书
计算机专业学生的自我评价
2013/12/15 职场文书
在校学生职业规划范文
2014/01/08 职场文书
大学学雷锋活动总结
2014/06/26 职场文书
学生会干部自我鉴定2014
2014/09/18 职场文书
2014年统计工作总结
2014/11/21 职场文书
超市采购员岗位职责
2015/04/07 职场文书
《只有一个地球》教学反思
2016/02/16 职场文书