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 相关文章推荐
基于文本的留言簿
Oct 09 PHP
PHP初学者常见问题集合 修正版(21问答)
Mar 23 PHP
关于crontab的使用详解
Jun 24 PHP
php中如何使对象可以像数组一样进行foreach循环
Aug 09 PHP
php页面函数设置超时限制的方法
Dec 01 PHP
Laravel接收前端ajax传来的数据的实例代码
Jul 20 PHP
php实现数组中出现次数超过一半的数字的统计方法
Oct 14 PHP
PHP微商城开源代码实例
Mar 27 PHP
PHP常见的几种攻击方式实例小结
Apr 29 PHP
PHP反射学习入门示例
Jun 14 PHP
PHP常见的序列化与反序列化操作实例分析
Oct 28 PHP
如何利用PHP实现上传图片功能详解
Sep 24 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
ThinkPHP实现事务回滚示例代码
2014/06/23 PHP
php数组指针操作详解
2017/02/14 PHP
PHP+MySQL实现在线测试答题实例
2020/01/02 PHP
JS获取地址栏参数的小例子
2013/08/23 Javascript
js实现的常用的左侧导航效果
2013/10/17 Javascript
教你如何使用node.js制作代理服务器
2014/11/26 Javascript
jQuery中:checked选择器用法实例
2015/01/04 Javascript
2则自己编写的jQuery特效分享
2015/02/26 Javascript
浅析jQuery中使用$所引发的问题
2016/05/29 Javascript
jQuery插件HighCharts实现的2D面积图效果示例【附demo源码下载】
2017/03/15 Javascript
React组件之间的通信的实例代码
2017/06/27 Javascript
jQuery菜单实例(全选,反选,取消)
2017/08/28 jQuery
几个你不知道的技巧助你写出更优雅的vue.js代码
2018/06/11 Javascript
打通前后端构建一个Vue+Express的开发环境
2018/07/17 Javascript
实例讲解JavaScript截取字符串
2018/11/30 Javascript
Vue实现微信支付功能遇到的坑
2019/06/05 Javascript
vue集成kindeditor富文本的实现示例代码
2019/06/07 Javascript
vscode+gulp轻松开发小程序的完整步骤
2020/10/18 Javascript
swiper实现导航滚动效果
2020/12/13 Javascript
python字符串连接方式汇总
2014/08/21 Python
pycharm中使用anaconda部署python环境的方法步骤
2018/12/19 Python
python tools实现视频的每一帧提取并保存
2020/03/20 Python
Python中一个for循环循环多个变量的示例
2019/07/16 Python
python图像处理模块Pillow的学习详解
2019/10/09 Python
python实现将一维列表转换为多维列表(numpy+reshape)
2019/11/29 Python
keras 实现轻量级网络ShuffleNet教程
2020/06/19 Python
Python 实现集合Set的示例
2020/12/21 Python
马来西亚和新加坡巴士票在线预订:CatchThatBus
2018/11/17 全球购物
韩国演唱会订票网站:StubHub韩国
2019/01/17 全球购物
Theo + George官方网站:都柏林时尚品牌
2019/04/08 全球购物
世界上最伟大的马产品:Equiderma
2020/01/07 全球购物
简单的项目建议书模板
2014/03/12 职场文书
少年派的奇幻漂流观后感
2015/06/08 职场文书
小学六年级毕业感言
2015/07/30 职场文书
Python数据可视化之绘制柱状图和条形图
2021/05/25 Python
python图像处理 PIL Image操作实例
2022/04/09 Python