thinkphp3.2 上传图片兼容小程序
第一步在配置文件中设置图片的大小和路径
return array(
//'配置项'=>'配置值'
'img_save'=>[
'size' =>[
'app_gszc_Card'=>[
'compress'=>array(
'w'=> 720,
'h'=> 520
),
'page_size'=>array(
'w'=> 720,
'h'=> 520
),
], ],
'save_path'=>[
'app_gszc_Card' => array(
'origin' => './Uploads/gszc_card/origin/',
'page_size' => './Uploads/gszc_card/page_size/',
)
]
]
);
二.上传图片类文件
<?php
/**
* Created by PhpStorm.
* User: Administrator
* Date: 2017-4-27 0027
* Time: 10:49
*/
namespace Gszc\Event; use \Think\Image;
use \Think\Upload;
class ImgEvent
{ private $THINK_IMAGE = null;
private $THINK_UPLOAD = null; public function __construct()
{
$this->THINK_IMAGE = new Image();
$this->THINK_UPLOAD = new Upload();
} /*
* 保存base64文件
* $img string base64类型的文件
* $type string 保存的文件类型
* app_user_head_img 用户头像
*
*
*/
public function saveImg_base64($img = null , $type = null)
{
//获取保存图片配置
$imgConfig_savePath = C("img_save.save_path");
$imgConfig_size = C("img_save.size");
$saveFlag = false;
// dump($imgConfig_savePath[$type]);
// dump($imgConfig_size); if (preg_match('/^(data:\s*image\/(\w+);base64,)/', $img, $result) && $imgConfig_savePath[$type])
{ $img_ext = $result[2]; //图片后缀
$img_header = $result[1];//图片头信息
$new_file_name = date('Ymd').'/'.uniqid().'.'.$img_ext;
$origin_img_path = '';//原图的保存路径
$origin_img_save_flag = true;//
foreach($imgConfig_savePath[$type] as $k => $v)
{ if(!is_dir($v.date('Ymd')))
{
mkdir($v.date('Ymd'),0777,true);
} if ($k == 'origin')
{
//先保存一份原图,然后其他尺寸的保存直接调用原图路径origin_img_path.
$origin_res = file_put_contents($v.$new_file_name, base64_decode(str_replace($img_header, '', $img)));
if (!$origin_res)
{
$origin_img_save_flag = false;
break;
}
else
{
$saveFlag = $new_file_name;
$origin_img_path = $v.$new_file_name;
$this->THINK_IMAGE->open($origin_img_path);
}
}
else
{
if ($origin_img_save_flag)
{
$width = $imgConfig_size[$type][$k]['w'];
$height = $imgConfig_size[$type][$k]['h'];
$this->THINK_IMAGE->thumb($width, $height,3)->save($v.$new_file_name);
} }
} }
return $saveFlag;
} /*
* 保存file类型文件
*
*/
public function saveImg_file($img = null , $type = null)
{ //获取保存图片配置
$imgConfig_savePath = C("img_save.save_path");
$imgConfig_size = C("img_save.size");
$saveFlag = false; if ($img && $imgConfig_savePath[$type])
{ $origin_img_save_flag = true;
foreach($imgConfig_savePath[$type] as $k => $v)
{ if(!is_dir($v.date('Ymd')))
{
mkdir($v.date('Ymd'),0777,true);
} if ($k == 'origin')
{
$this->THINK_UPLOAD->rootPath = $v;
$this->THINK_UPLOAD->subName = date('Ymd');
$this->THINK_UPLOAD->saveName = array('uniqid','');
$saveRes = $this->THINK_UPLOAD->uploadOne($img);
if (!$saveRes)
{
$origin_img_save_flag = false;
}
else
{
$saveFlag = true;
$origin_img_path = $v.$saveRes['savepath'].$saveRes['savename'];
$this->THINK_IMAGE->open($origin_img_path);
$fileName = $saveRes['savepath'].$saveRes['savename'];
}
}
else
{
if ($origin_img_save_flag)
{
$width = $imgConfig_size[$type][$k]['w'];
$height = $imgConfig_size[$type][$k]['h'];
$saveFlag = $this->THINK_IMAGE->thumb($width, $height,3)->save($v.$fileName); if (!$saveFlag)
{
$saveFlag = false;
$origin_img_save_flag = false;
} }
} } if($saveFlag)
{
$saveFlag = $fileName;
} }
return $saveFlag;
} /*
* 保存file类型文件,多文件
*
*/
public function saveImgs_files($imgs = null , $type = null)
{ //获取保存图片配置s
$imgConfig_savePath = C("img_save.save_path");
$imgConfig_size = C("img_save.size");
$saveFlag = false;
$imgResArr = array();//保存图片路径
$origin_img_path = array();//原图路径 if ($imgs && $imgConfig_savePath[$type])
{ $origin_img_save_flag = true;
foreach($imgConfig_savePath[$type] as $k => $v)
{ if(!is_dir($v.date('Ymd')))
{
mkdir($v.date('Ymd'),0777,true);
} if ($k == 'origin')
{
$this->THINK_UPLOAD->rootPath = $v;
$this->THINK_UPLOAD->subName = date('Ymd');
$this->THINK_UPLOAD->saveName = array('uniqid','');
$saveRes = $this->THINK_UPLOAD->upload($imgs); if ($saveRes)
{
$saveFlag = true;
foreach ($saveRes as $srK => $srV)
{
$origin_img_path[] = $v.$saveRes[$srK]['savepath'].$saveRes[$srK]['savename'];
$fileName = $saveRes[$srK]['savepath'].$saveRes[$srK]['savename'];
$imgResArr[] = $fileName;
} }
}
else
{
foreach($origin_img_path as $oipK => $oipV)
{
if ($saveFlag)
{
$width = $imgConfig_size[$type][$k]['w'];
$height = $imgConfig_size[$type][$k]['h'];
$this->THINK_IMAGE->open($oipV);
$saveThumb = $this->THINK_IMAGE->thumb($width, $height,3)->save($v.$imgResArr[$oipK]);
if (!$saveThumb)
{
$saveFlag = false;
break;
}
}
} } } if ($saveFlag)
{
$saveFlag = $imgResArr;
}
}
return $saveFlag;
} /*
* 保存微信头像 - url
*
*/
public function save_WxImg($picUrl = '',$type = null)
{ $ch = curl_init($picUrl);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_NOBODY, 0); //对body进行输出。
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$package = curl_exec($ch);
$httpInfo = curl_getinfo($ch);
curl_close($ch);
$media = array_merge(array('mediaBody' => $package), $httpInfo); //求出文件格式
preg_match('/\w\/(\w+)/i', $media["content_type"], $extmatches);
$fileExt = $extmatches[1]; $saveName = md5(microtime(true)).".{$fileExt}"; //获取保存图片配置
$imgConfig_savePath = C("img_save.save_path");
$imgConfig_size = C("img_save.size");
$saveFlag = false; if ($imgConfig_savePath[$type])
{ $origin_img_save_flag = true;
foreach($imgConfig_savePath[$type] as $k => $v)
{ if(!is_dir($v.date('Ymd')))
{
mkdir($v.date('Ymd'),0777,true);
} if ($k == 'origin')
{
file_put_contents($v.'/'.date('Ymd').'/'.$saveName,$media['mediaBody']); $origin_img_path = $v.'/'.date('Ymd').'/'.$saveName;
$this->THINK_IMAGE->open($origin_img_path);
$fileName = date('Ymd').'/'.$saveName;
}
else
{
if ($origin_img_save_flag)
{
$width = $imgConfig_size[$type][$k]['w'];
$height = $imgConfig_size[$type][$k]['h'];
$saveFlag = $this->THINK_IMAGE->thumb($width, $height,3)->save($v.$fileName); if (!$saveFlag)
{
$saveFlag = false;
$origin_img_save_flag = false;
}
else
{
$saveFlag = $fileName;
}
} }
}
}
return $saveFlag; } /*
* 保存file类型文件
*
*/
public function saveImg_Wx($WxImg = array() , $type = null)
{ //获取保存图片配置
$imgConfig_savePath = C("img_save.save_path");
$imgConfig_size = C("img_save.size");
$saveFlag = false;
$imgResArr = array(); if ($WxImg && $imgConfig_savePath[$type])
{ foreach ($WxImg as $wiK => $wiV)
{ $wxImg = $this->getWxImg($wiV); $origin_img_save_flag = true;
foreach($imgConfig_savePath[$type] as $k => $v)
{ if(!is_dir($v.date('Ymd')))
{
mkdir($v.date('Ymd'),0777,true);
} if ($k == 'origin')
{
file_put_contents($v.'/'.date('Ymd').'/'.$wxImg['saveName'],$wxImg['imgMedia']['mediaBody']); $origin_img_path = $v.'/'.date('Ymd').'/'.$wxImg['saveName'];
$this->THINK_IMAGE->open($origin_img_path);
$fileName = date('Ymd').'/'.$wxImg['saveName'];
$imgResArr[] = $fileName;
}
else
{
if ($origin_img_save_flag)
{
$width = $imgConfig_size[$type][$k]['w'];
$height = $imgConfig_size[$type][$k]['h'];
$saveFlag = $this->THINK_IMAGE->thumb($width, $height,3)->save($v.$fileName); if (!$saveFlag)
{
$saveFlag = false;
$origin_img_save_flag = false;
}
else
{
$saveFlag = $fileName;
}
} }
}
} if($saveFlag)
{
$saveFlag = $imgResArr;
} }
return $saveFlag;
} /*
* 保存用户的推广图片
*/
public function save_userShareImg($bg_img_path = '' , $head_img_path = '' , $qrCode_img_path = '' , $saveFile = '' , $userName = '' , $userDscp = '' , $font_path = '')
{ //设置头像图片为圆角
$head_img_radius = $this->radius_img($head_img_path,240);
//合并到背景图中
$this->mergeImage($bg_img_path,$head_img_radius,$saveFile,array('left' => 200, 'top' => 55, 'width' => 480, 'height' => 480));
//设置名称
$this->writeText($saveFile, $saveFile, $userName,255,255,255,1010,32,$font_path, array());
//设置二维码内容
$this->mergeImage($saveFile,$qrCode_img_path,$saveFile,array('left' => 255, 'top' => 684, 'width' => 250, 'height' => 245)); return $saveFile;
} /*
* 合并图片
*/
private function mergeImage($bg_img, $main_img, $saveFile, $param)
{ extract($param);
// list($bgWidth, $bgHeight) = getimagesize($bg_img);
$bgImg = $this->imagecreate($bg_img);
if (!is_resource($main_img))
{
list($mainWidth, $mainHeight) = getimagesize($main_img);
$mainImg = $this->imagecreate($main_img);
}
else
{
$mainImg = $main_img; $mainWidth = $width;
$mainHeight = $height;
}
imagecopyresized($bgImg, $mainImg, $left, $top, 0, 0, $width, $height, $mainWidth, $mainHeight);
// imagecopyresized($bgImg, $mainImg, $left, $top, 0, 0, $width, $height, $width,$height);
ob_start();
// output jpeg (or any other chosen) format & quality
imagejpeg($bgImg, NULL, 100);
$contents = ob_get_contents();
ob_end_clean();
imagedestroy($bgImg);
imagedestroy($mainImg);
$fh = fopen($saveFile, "w+");
fwrite($fh, $contents);
fclose($fh);
} /*
* 图片写文字
* $bg_img 背景图片
* $saveFile 保存图片路径
* $text 文字
* $fontColor 字体颜色
* $top 图片距离顶端高度
* $fontSize 字体大小
* $font 字体路径
* $param 传递的参数
*/
private function writeText($bg_img, $saveFile, $text, $colorR,$colorG,$colorB , $top , $fontSize , $font , $param = array())
{
list($bgWidth, $bgHeight) = getimagesize($bg_img);
$im = imagecreatefromjpeg($bg_img); $fontColor = imagecolorallocate($im, $colorR, $colorG, $colorB);//字的RGB颜色
$str = mb_convert_encoding($text, "html-entities", "utf-8");;//解决乱码问题 $fontBox = imagettfbbox($fontSize, 0, $font, $str);//文字水平居中实质
$width = imagesx($im);
imagettftext($im, $fontSize, 0, ceil(($width - $fontBox[2]) / 2), $top, $fontColor, $font, $str); ob_start();
// output jpeg (or any other chosen) format & quality
imagejpeg($im, NULL, 100);
$contents = ob_get_contents();
ob_end_clean();
imagedestroy($im);
$fh = fopen($saveFile, "w+");
fwrite($fh, $contents);
fclose($fh);
} /**
* 处理圆角图片
* @param string $imgPath 源图片路径
* @param integer $radius 圆角半径长度默认为15,处理成圆型
* @return [type] [description]
*/
public function radius_img($imgPath = '', $radius = 65)
{
$ext = pathinfo($imgPath);
$src_img = null;
switch ($ext['extension']) {
case 'jpg':
$src_img = imagecreatefromjpeg($imgPath);
break;
case 'png':
$src_img = imagecreatefrompng($imgPath);
break;
default:
$src_img = imagecreatefromjpeg($imgPath);
break;
}
$wh = getimagesize($imgPath);
$w = $wh[0];
$h = $wh[1];
// $radius = $radius == 0 ? (min($w, $h) / 2) : $radius;
$img = imagecreatetruecolor($w, $h);
//这一句一定要有
imagesavealpha($img, true);
//拾取一个完全透明的颜色,最后一个参数127为全透明
$bg = imagecolorallocatealpha($img, 255, 255, 255, 127);
imagefill($img, 0, 0, $bg);
$r = $radius; //圆 角半径
for ($x = 0; $x < $w; $x++) {
for ($y = 0; $y < $h; $y++) {
$rgbColor = imagecolorat($src_img, $x, $y);
if (($x >= $radius && $x <= ($w - $radius)) || ($y >= $radius && $y <= ($h - $radius))) {
//不在四角的范围内,直接画
imagesetpixel($img, $x, $y, $rgbColor);
} else {
//在四角的范围内选择画
//上左
$y_x = $r; //圆心X坐标
$y_y = $r; //圆心Y坐标
if (((($x - $y_x) * ($x - $y_x) + ($y - $y_y) * ($y - $y_y)) <= ($r * $r))) {
imagesetpixel($img, $x, $y, $rgbColor);
}
//上右
$y_x = $w - $r; //圆心X坐标
$y_y = $r; //圆心Y坐标
if (((($x - $y_x) * ($x - $y_x) + ($y - $y_y) * ($y - $y_y)) <= ($r * $r))) {
imagesetpixel($img, $x, $y, $rgbColor);
}
//下左
$y_x = $r; //圆心X坐标
$y_y = $h - $r; //圆心Y坐标
if (((($x - $y_x) * ($x - $y_x) + ($y - $y_y) * ($y - $y_y)) <= ($r * $r))) {
imagesetpixel($img, $x, $y, $rgbColor);
}
//下右
$y_x = $w - $r; //圆心X坐标
$y_y = $h - $r; //圆心Y坐标
if (((($x - $y_x) * ($x - $y_x) + ($y - $y_y) * ($y - $y_y)) <= ($r * $r))) {
imagesetpixel($img, $x, $y, $rgbColor);
}
}
}
}
return $img;
} private function imagecreate($bg)
{
$bgImg = @imagecreatefromjpeg($bg);
if (FALSE == $bgImg) {
$bgImg = @imagecreatefrompng($bg);
}
if (FALSE == $bgImg) {
$bgImg = @imagecreatefromgif($bg);
}
return $bgImg;
} /*
* 下载微信服务器的图片
* media_id 微信的媒体id
* type 保存图片类型
* */
public function getWxImg($mediaId)
{
if(!class_exists('\JSSDK') && !class_exists('\WxPayConfig'))
{
vendor('wxsdkapi.jssdk');
vendor('wxpayapi.lib.WxPay#Config');
}
$res = new \JSSDK(C('WEIXINPAY_CONFIG.APPID'),C('WEIXINPAY_CONFIG.APPSECRET'));
$accessToken = $res->getAccessToken(); // $mediaId = 'cVqPIhDPPThUtayzS27GK6RN4-dseA6AZnTJxcg7_VaeuAaKcL53X32hmKxhgiSD';
// $accessToken = 'KHaopJY444kJ06LcH9ESj-73pkEfFTgIr3L45RURuUxv1KTjgXyFepJ-cTIF_oUyAKyYb5dK2r9L_wC-WDw2USqGQBMobC6DzPImuhPqxB8jxZ41CuLDtJiaEZk8Vf5kWSSjAAAAWW';
$picUrl = "http://file.api.weixin.qq.com/cgi-bin/media/get?access_token=$accessToken&media_id=$mediaId"; $ch = curl_init($picUrl);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_NOBODY, 0); //对body进行输出。
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$package = curl_exec($ch);
$httpInfo = curl_getinfo($ch);
curl_close($ch);
$media = array_merge(array('mediaBody' => $package), $httpInfo); //求出文件格式
preg_match('/\w\/(\w+)/i', $media["content_type"], $extmatches);
$fileExt = $extmatches[1]; $saveName = md5(microtime(true)).".{$fileExt}"; $img = array('imgMedia'=>$media,'saveName'=>$saveName); return $img;
}
/*
* 下载微信服务器的图片
* media_id 微信的媒体id
* type 保存图片类型
* */
public function getWxImg2($mediaId,$file)
{
if(!class_exists('\JSSDK') && !class_exists('\WxPayConfig'))
{
vendor('wxsdkapi.jssdk');
vendor('wxpayapi.lib.WxPay#Config');
}
$res = new \JSSDK(C('WEIXINPAY_CONFIG.APPID'),C('WEIXINPAY_CONFIG.APPSECRET'));
$accessToken = $res->getAccessToken();
$picUrl = "http://file.api.weixin.qq.com/cgi-bin/media/get?access_token=$accessToken&media_id=$mediaId"; return httpcopy($picUrl,$file);
} }
三.调用方法 上传图片
/**
* 上传图片
* @param varchar file 图片文件
* @httpmethod POST
* @response 响应数据
* {
* "ResultType": "1000",
* "Message": "上传成功",
* "AppendData": "图片路径",
* }
*/
public function UploadNavImg()
{
$imgEven = A('Gszc/Img','Event');
if(!empty($_FILES['file']['name'])){
$img=$imgEven->saveImg_file($_FILES['file'],'app_gszc_Card'); $this->array_return['errno']=self::__OK__;
$this->array_return['errmsg']='上传成功!';
$this->array_return['data']=$img;
$this->ajaxReturn($this->array_return);
}
$this->array_return['errno']=self::__ERROR__;
$this->array_return['errmsg']='没有上传文件!';
$this->array_return['data']=[];
$this->ajaxReturn($this->array_return); }
thinkphp3.2 上传图片兼容小程序的更多相关文章
- 兼容小程序的canvas画图组件jmGraph
基于CANVAS的简单画图组件让你用类似于dom的方式,在canvas上画图,感觉会不会很爽. 主页:http://graph.jm47.com/示例:http://graph.jm47.com/ex ...
- 集成微信支付的代码。兼容小程序,扫码,app,公众号。h5 支付 ,以及 服务商提现
/** * 因为微信总是很多个商户号很多和appid.很多个密钥文件,所以全部改成手动传值的方式,就可以支持多商户调用 * * @param appId 商户的appid * @param mch ...
- 微信小程序 一些要点
微信小程序,weixin,关于微信小程序,那些开发文档没有告诉你的-微信小程序开发资源-微信开发者平台,微信开发者社区,微信小程序开发者社区 Discuz! Team and Comsenz UI T ...
- 微信小程序(兼容性问题)
兼容 小程序的功能不断的增加,但是旧版本的微信客户端并不支持新功能,所以在使用这些新能力的时候需要做兼容. 文档会在组件,API等页面描述中带上各个功能所支持的版本号. 可以通过 wx.getSyst ...
- mpvue-编写微信小程序总结
一.写在前面: .....最近在写一个微信小程序项目,在看完官方微信小程序开发文档后,有一种直接想"放弃"的念头: .....使用微信小程序原生框架可以快速,方便,简洁的搭建项目, ...
- 【微信小程序项目实践总结】30分钟从陌生到熟悉
前言 我们之前对小程序做了基本学习: 1. 微信小程序开发07-列表页面怎么做 2. 微信小程序开发06-一个业务页面的完成 3. 微信小程序开发05-日历组件的实现 4. 微信小程序开发04-打造自 ...
- MpVue 致力打造H5与小程序的代码共用
MpVue是什么 基于 Vue.js 的小程序开发框架 从底层支持 Vue.js 语法和构建工具体系. 使用vue开发小程序 修改了 Vue.js 的 runtime 和 compiler 实现,使其 ...
- Taro 多端开发的正确姿势:打造三端统一的网易严选(小程序、H5、React Native)
笔者所在的趣店 FED 早在去年 10 月份就已全面使用 Taro 框架开发小程序(当时版本为 1.1.0-beta.4),至今也上线了 2 个微信小程序.2 个支付宝小程序. 之所以选用 Taro, ...
- 小程序解决方案 Westore - 组件、纯组件、插件开发
数据流转 先上一张图看清 Westore 怎么解决小程序数据难以管理和维护的问题: 非纯组件的话,可以直接省去 triggerEvent 的过程,直接修改 store.data 并且 update,形 ...
随机推荐
- xfs参数简介
age_buffer_centisecs age_buffer_centisecs:(Min: 100 Default: 1500 Max: 720000) 多长时间设置为脏数据 xfsbufd_ ...
- java线程面试手写题
1.设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1.写出程序. public class Question1 { private int j = 0; /** * @param ...
- js中问号
是三目运算,如:(a==b)?a:b 也就是说,先判断a是否等于b,如果是(true),那么返回a,如果否(false),则返回b greeting=(visitor=="PRES" ...
- Java学习---MD5加密算法
前言 在我们日常的程序开发中,或多或少会遇到一些加密/解密的场景,比如在一些接口调用的过程中,我们(Client)不仅仅需要传递给接口服务(Server)必要的业务参数,还得提供Signature(数 ...
- 使用 Nginx 对 ASP.NETCore网站 或 Docker 等进行反向代理,宝塔面板对 ASP.NET Core 反向代理
1,Nginx 的 配置文件 Nginx 可以配置反向代理.负载均匀等, 其默认配置文件名为 nginx.conf . 一般存放于 /你的安装目录/nginx/conf 下 Nginx 加载配置信息 ...
- 如何让4年前的电脑装win10开机跑进15秒
我是用我的电脑测试的.看看我电脑的配置 我的是windows10,机械硬盘. 在这里要说的是给电脑优化,让其开机更快.当然,因电脑配置而异,我的最快是11秒.标题可能有点夸张了,结果因电脑配置而异,高 ...
- mysql DML语句学习1
DML 操作是指对数据库中表记录的操作,主要包括表记录插入(insert).更新(update).删除(delete)和查询(select) 1. 插入记录 表创建好后,就可以往里插入记录,基本语句如 ...
- pat 5—1 求该日是该年的第几天
哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈 前面还是欠了一堆,慢慢补吧. 看了别人的博客才知道前面有一次圆面积的题,我上课是在干啥......... 打是打出来了,但是还是有几个蒙蔽的地方: ...
- java继承-final关键词用法
final关键字特点: 1.可以用来修饰变量.方法.类. 2.修饰的变量是一个常量.一旦被赋值就不能被修改(常量一般都和static关键字配合使用) 3.修饰类代表此类不能被继承4.修饰方法代表次方法 ...
- mysql-存储过程(转载)
本来想自己写存储过程的,但是看到别人写的很全面,就直接转载过来了. 转自(http://www.cnblogs.com/exmyth/p/3303470.html) 14.1.1 创建存储过程 MyS ...