PHP实现接收二进制流转换成图片的方法
本文实例讲述了PHP实现接收二进制流转换成图片的方法。分享给大家供大家参考,具体如下:
这里实现php接收二进制流转换成图片,所使用的图片类imageUpload.php如下:
<?php
/**
*图片类
*@version1.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"。
*/
classimageUpload{
constROOT_PATH='./';
constFAIL_WRITE_DATA='Failtowritedata';
//没有数据流
constNO_STREAM_DATA='Thepostdataisempty';
//图片类型不正确
constNOT_CORRECT_TYPE='Notacorrectimagetype';
//不能创建文件
constCAN_NOT_CREATE_FILE='Cannotcreatefile';
//上传图片名称
public$image_name;
//图片保存名称
public$save_name;
//图片保存路径
public$save_dir;
//目录+图片完整路径
public$save_fullpath;
/**
*构造函数
*@paramString$save_name保存图片名称
*@paramString$save_dir保存路径名称
*/
publicfunction__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
publicfunctionimage($save_name){
$this->__construct($save_name);
}
publicfunctionstream2Image(){
//二进制数据流
$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);
}
}
/**
*创建文件夹
*@paramString$dirName文件夹路径名
*/
publicfunctioncreate_dir($dirName,$recursive=1,$mode=0777){
!is_dir($dirName)&&mkdir($dirName,$mode,$recursive);
}
/**
*获取图片信息,返回图片的宽、高、类型、大小、图片mine类型
*@paramString$imageName图片名称
*/
publicfunctiongetimageInfo($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{
//不是合法的图片
returnfalse;
}
}
/*privatefunctionerror_handler($a,$b){
echo$a,$b;
}*/
}
?>
PS:这里再为大家推荐几款比较实用的图片处理工具供大家参考使用:
在线图片转换BASE64工具:
http://tools.jb51.net/transcoding/img2base64
ICO图标在线生成工具:
http://tools.jb51.net/aideddesign/ico_img
在线Email邮箱图标制作工具:
http://tools.jb51.net/email/emaillogo
在线图片格式转换(jpg/bmp/gif/png)工具:
http://tools.jb51.net/aideddesign/picext
更多关于PHP相关内容感兴趣的读者可查看本站专题:《PHP图形与图片操作技巧汇总》、《PHP基本语法入门教程》、《PHP运算与运算符用法总结》、《php面向对象程序设计入门教程》、《PHP网络编程技巧总结》、《PHP数组(Array)操作技巧大全》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》
希望本文所述对大家PHP程序设计有所帮助。