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 相关文章推荐
无JS,完全php面向过程数据分页实现代码
Aug 27 PHP
php随机输出名人名言的代码
Oct 07 PHP
PHP代码优化的53个细节
Mar 03 PHP
CodeIgniter启用缓存和清除缓存的方法
Jun 12 PHP
PHP开发框架kohana中处理ajax请求的例子
Jul 14 PHP
用 Composer构建自己的 PHP 框架之构建路由
Oct 30 PHP
Windows7下的php环境配置教程
Feb 28 PHP
php微信支付接口开发程序
Aug 02 PHP
PHP实现生成带背景的图形验证码功能
Oct 03 PHP
PHP编程计算文件或数组中单词出现频率的方法
May 22 PHP
快速解决PHP调用Word组件DCOM权限的问题
Dec 27 PHP
php实现对短信验证码发送次数的限制实例讲解
Mar 04 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&amp;mysql(五)
2006/10/09 PHP
php 带逗号千位符数字的处理方法
2012/01/10 PHP
关于js与php互相传值的介绍
2013/06/25 PHP
codeigniter中测试通过的分页类示例
2014/04/17 PHP
php相对当前文件include其它文件的方法
2015/03/13 PHP
实例说明js脚本语言和php脚本语言的区别
2019/04/04 PHP
javascript 操作cookies及正确使用cookies的属性
2009/10/15 Javascript
jQuery 处理网页内容的实现代码
2010/02/15 Javascript
jQuery 1.5.1 发布,全面支持IE9 修复大量bug
2011/02/26 Javascript
在javascript中关于节点内容加强
2013/04/11 Javascript
JQuery-tableDnD 拖拽的基本使用介绍
2013/07/04 Javascript
JS 获取滚动条高度示例代码
2013/10/24 Javascript
get(0).tagName获得作用标签示例代码
2014/10/08 Javascript
为JS扩展Array.prototype.indexOf引发的问题及解决办法
2015/01/21 Javascript
jQuery Validation Plugin验证插件手动验证
2016/01/26 Javascript
JavaScript 计算笛卡尔积实例详解
2016/12/02 Javascript
javascript基础知识之html5轮播图实例讲解(44)
2017/02/17 Javascript
详解JS异步加载的三种方式
2017/03/07 Javascript
React利用插件和不用插件实现双向绑定的方法详解
2017/07/03 Javascript
node.js之基础加密算法模块crypto详解
2018/09/11 Javascript
vue 实现动态路由的方法
2020/07/06 Javascript
JavaScript实现简单验证码
2020/08/24 Javascript
详谈Numpy中数组重塑、合并与拆分方法
2018/04/17 Python
Python编程快速上手——强口令检测算法案例分析
2020/02/29 Python
jupyter notebook 添加kernel permission denied的操作
2020/04/21 Python
浅谈keras中自定义二分类任务评价指标metrics的方法以及代码
2020/06/11 Python
Html5 webRTC简单实现视频调用的示例代码
2020/09/23 HTML / CSS
Bed Bath & Beyond加拿大官网:购买床上用品、浴巾、厨房电器等
2019/10/04 全球购物
英国最受欢迎的母婴精品品牌:JoJo Maman BéBé
2021/02/17 全球购物
英国健身专家:WIT Fitness
2021/02/09 全球购物
开展批评与自我批评发言材料
2014/05/15 职场文书
2014幼儿园教师个人工作总结
2014/11/08 职场文书
寒假安全保证书
2015/02/28 职场文书
2015领导干部廉洁自律工作总结
2015/07/23 职场文书
2015年大学组织委员个人工作总结
2015/10/23 职场文书
端午节将至,用Python爬取粽子数据并可视化,看看网友喜欢哪种粽子吧!
2021/06/11 Python