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编程效率 引入缓存机制提升性能
Feb 15 PHP
关于访问控制的一首PHP面试题(对属性或方法的访问控制)
Sep 13 PHP
php调用KyotoTycoon简单实例
Apr 02 PHP
解决php的“It is not safe to rely on the system’s timezone settings”问题
Oct 08 PHP
PHP编写文件多服务器同步程序
Jul 02 PHP
微信支付开发发货通知实例
Jul 12 PHP
php上传excel表格并获取数据
Apr 27 PHP
老生常谈PHP数组函数array_merge(必看篇)
May 25 PHP
php7基于递归实现删除空文件夹的方法示例
Jun 15 PHP
浅谈thinkphp5 instance 的简单实现
Jul 30 PHP
Yii2结合Workerman的websocket示例详解
Sep 10 PHP
Laravel 创建指定表 migrate的例子
Oct 09 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/06/08 PHP
memcache一致性hash的php实现方法
2015/03/05 PHP
PHP配置ZendOpcache插件加速
2019/02/14 PHP
ThinkPHP3.1.2 使用cli命令行模式运行的方法
2020/04/14 PHP
JavaScript Memoization 让函数也有记忆功能
2011/10/27 Javascript
javascript浏览器窗口之间传递数据的方法
2015/01/20 Javascript
15款最好的Bootstrap在线编辑器
2016/08/03 Javascript
Javascript vue.js表格分页,ajax异步加载数据
2016/10/24 Javascript
js实现简单的网页换肤效果
2017/01/18 Javascript
JQ中$(window).load和$(document).ready区别与执行顺序
2017/03/01 Javascript
浅谈原生JS中的延迟脚本和异步脚本
2017/07/12 Javascript
JS实现基于Sketch.js模拟成群游动的蝌蚪运动动画效果【附demo源码下载】
2017/08/18 Javascript
vue2中的keep-alive使用总结及注意事项
2017/12/21 Javascript
JS实现的集合去重,交集,并集,差集功能示例
2018/03/13 Javascript
Angular5集成eventbus的示例代码
2018/07/19 Javascript
微信小程序开发实现的IP地址查询功能示例
2019/03/28 Javascript
vue的三种图片引入方式代码实例
2019/11/19 Javascript
JavaScript浅层克隆与深度克隆示例详解
2020/09/01 Javascript
vue 中this.$set 动态绑定数据的案例讲解
2021/01/29 Vue.js
[01:38]DOTA2辉夜杯 欢乐的观众现场采访
2015/12/26 DOTA
浅析python3中的os.path.dirname(__file__)的使用
2018/08/30 Python
python实现自动登录后台管理系统
2018/10/18 Python
PyQt5实现简单数据标注工具
2019/03/18 Python
Python实现定时执行任务的三种方式简单示例
2019/03/30 Python
解决pycharm运行程序出现卡住scanning files to index索引的问题
2019/06/27 Python
Python实现直方图均衡基本原理解析
2019/08/08 Python
HTML5新增的8类INPUT输入类型介绍
2015/07/06 HTML / CSS
惠普香港官方商店:HP香港
2019/04/30 全球购物
乌克兰第一的珠宝网上商店:Gold.ua
2019/11/29 全球购物
家长给孩子的表扬信
2014/01/17 职场文书
股权转让协议书
2014/04/12 职场文书
三方合作协议书范本
2014/04/18 职场文书
2014预备党员党课学习心得范文
2014/07/08 职场文书
仰望星空观后感
2015/06/10 职场文书
Python关于OS文件目录处理的实例分享
2021/05/23 Python
24年收藏2000多部退役军用电台
2022/02/18 无线电