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 相关文章推荐
新安装的MySQL数据库需要注意的安全知识
Jul 30 PHP
php单例模式实现(对象只被创建一次)
Dec 05 PHP
更改localhost为其他名字的方法
Feb 10 PHP
php根据日期判断星座的函数分享
Feb 13 PHP
php实现的百度搜索某地天气的小偷代码
Apr 23 PHP
PHP命名空间(namespace)的使用基础及示例
Aug 18 PHP
ThinkPHP查询返回简单字段数组的方法
Aug 25 PHP
检测codeigniter脚本消耗内存情况的方法
Mar 21 PHP
WordPress主题中添加文章列表页页码导航的PHP代码实例
Dec 22 PHP
thinkphp框架下404页面设置 仅三步
May 14 PHP
PHP编程之设置apache虚拟目录
Jul 08 PHP
PHP获取HTTP body内容的方法
Dec 31 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应用程序的七个习惯深入分析
2013/06/08 PHP
如何让搜索引擎抓取AJAX内容解决方案
2014/08/25 PHP
PHP 开发者该知道的 5 个 Composer 小技巧
2016/02/03 PHP
浅谈PHP匿名函数和闭包
2019/03/08 PHP
基于laravel-admin 后台 列表标签背景的使用方法
2019/10/03 PHP
[原创]后缀就扩展名为js的文件是什么文件
2007/12/06 Javascript
js 可拖动列表实现代码
2011/12/13 Javascript
学习javascript面向对象 掌握创建对象的9种方式
2016/01/04 Javascript
JavaScript获取对象在页面中位置坐标的方法
2016/02/03 Javascript
JS插件plupload.js实现多图上传并显示进度条
2016/11/29 Javascript
微信小程序滚动Tab实现左右可滑动切换
2017/08/17 Javascript
jQuery实现简单日期格式化功能示例
2017/09/19 jQuery
node.js中路由,中间件,ge请求和post请求的参数详解
2017/12/26 Javascript
Angularjs实现控制器之间通信方式实例总结
2018/03/27 Javascript
pageGroup.js实现分页功能
2019/07/27 Javascript
JSON获取属性值方法代码实例
2020/06/30 Javascript
vue $mount 和 el的区别说明
2020/09/11 Javascript
Nuxt 嵌套路由nuxt-child组件用法(父子页面组件的传值)
2020/11/05 Javascript
Numpy的简单用法小结
2019/08/28 Python
利用Python绘制有趣的万圣节南瓜怪效果
2019/10/31 Python
python使用配置文件过程详解
2019/12/28 Python
PyCharm如何导入python项目的方法
2020/02/06 Python
Python基于class()实现面向对象原理详解
2020/03/26 Python
LINUX下线程,GDI类的解释
2012/04/17 面试题
某公司面试题
2012/03/05 面试题
房屋改造计划书
2014/01/10 职场文书
高中生学期学习自我评价
2014/02/24 职场文书
晚会主持词开场白
2014/03/17 职场文书
《学会合作》教学反思
2014/04/12 职场文书
社会稳定风险评估方案
2014/06/02 职场文书
费用申请报告范文
2015/05/15 职场文书
导游词之丹东鸭绿江
2019/10/24 职场文书
Python词云的正确实现方法实例
2021/05/08 Python
HTML5页面音频自动播放的实现方式
2021/06/21 HTML / CSS
MySQL分库分表详情
2021/09/25 MySQL
在NumPy中深拷贝和浅拷贝相关操作的定义和背后的原理
2022/04/14 Python