一、开发前准备:
1、AK: 2、SK(个人账户里可以看到) 3、存储空间名称 4、绑定域名(创建空间的时候分配临时域名过段时间会失效,需要解析个域名重定向到这里来,如需证书有免费的,需要认证审核)
5、七牛SDK源码地址:https://github.com/qiniu/php-sdk
二、vendor 里新建一个qiniu文件夹,将Sdk放里面
三、新创建一个专为上传到七牛的控制器
<?php /* 七牛管理控制器 */ namespace app\admin\controller; use think\Controller; use think\Session; use think\Request; use think\Db; vendor ('qiniu.autoload'); use Qiniu\Auth; use Qiniu\Storage\BucketManager; use Qiniu\Storage\UploadManager; class Qiniu extends Base{ //文件上传 public function Upload() { //获取七牛配置 $qn_accesskey=Db::name('config')->where(['name'=>'qn_accesskey'])->value('value');//AK $qn_secretkey=Db::name('config')->where(['name'=>'qn_secretkey'])->value('value');//SK $qn_bucket=Db::name('config')->where(['name'=>'qn_bucket'])->value('value');//存储空间 $qn_domain=Db::name('config')->where(['name'=>'qn_domain'])->value('value');//绑定域名 //接文件 $file = request() -> file('file'); //要上传图片的本地路径 $filePath = $file-> getRealPath(); $ext = pathinfo($file-> getInfo('name'),PATHINFO_EXTENSION); //后缀 $name=basename($file-> getInfo('name'),".{$ext}"); //上传到七牛后保存的文件名 $filename=substr(md5($file-> getRealPath()),0,5).date('YmdHis').rand (0,9999); $key = $filename.'.'.$ext; //需要填写你的访问密钥和密钥 $accessKey = $qn_accesskey; $secretKey = $qn_secretkey; //构建鉴权对象 $auth = new Auth($accessKey,$secretKey); //要上传的空间 $bucket = $qn_bucket; $domain = $qn_domain; $token = $auth-> uploadToken($bucket); //初始化UploadManager对象并进行文件的上传 $uploadMgr = new UploadManager(); //调用UploadManager的putFile方法进行文件的上传 list($ret,$err)= $uploadMgr-> putFile($token,$key,$filePath); if($err!=null){ return json(["code"=> 0,"msg"=> $err]); } else { //返回图片的完整URL $url ="{$qn_domain}/".$ret['key']; $data=['url'=>$url,'ext'=>$ext,'name'=>$filename]; return json(['code'=>1,'msg'=>'上传成功','data'=>$data]); } } //base64 数据流上传 Public function liuUpload($base_str){ header('Access-Control-Allow-Origin:*'); header("Content-type: image/jpg"); //获取七牛配置 $qn_accesskey=Db::name('config')->where(['name'=>'qn_accesskey'])->value('value'); $qn_secretkey=Db::name('config')->where(['name'=>'qn_secretkey'])->value('value'); $qn_bucket=Db::name('config')->where(['name'=>'qn_bucket'])->value('value'); $qn_domain=Db::name('config')->where(['name'=>'qn_domain'])->value('value'); $auth = new Auth($qn_accesskey, $qn_secretkey); //获取上传所需的token $upToken = $auth->uploadToken($qn_bucket, null, 3600); $str=$base_str; return $this->requestByCurl('http://upload.qiniu.com/putb64/-1',$str,$upToken); } public function requestByCurl($remote_server,$post_string,$upToken) { $headers = array(); $headers[] = 'Content-Type:image/png'; $headers[] = 'Authorization:UpToken '.$upToken; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL,$remote_server); //curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_HTTPHEADER ,$headers); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $post_string); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); curl_setopt($ch, CURLOPT_TIMEOUT, 30); $data = curl_exec($ch); curl_close($ch); return $data; } }
四、以下讲的是base64 流图片上传到七牛
步骤; 二进制图片-》图片保存到本地-》本地图片转换成base64 数据流-》删除本地临时图片和路径
use app\admin\controller\Qiniu;//放class顶部 $img=$this->change_picture($ewm_res); $base64_img=$this->base64EncodeImage($img); $this->delDirAndFile('./public/uploads/temporary/'); error_reporting(0); //上传到七牛 $Qiniu=new Qiniu(); $data=json_decode($Qiniu->liuUpload($base64_img),true); //成功将返回 key和hash值 $data['url']='http://'.$peizhi['qn_domain'].'/'.$data['hash'];//完整图片路径 //二进制二维码图片buffer,保存为临时图片 public function change_picture($imgs){ $path="./public/uploads/temporary/"; if(!is_dir($path)){ mkdir($path); } $new_file = "./public/uploads/temporary/" .'ewm'.date('Y-m-d',time()).getRandomString(8).".jpg"; //生成图片的名字 if(!empty($imgs)){ $file = fopen($new_file,"w");//打开文件准备写入 fwrite($file,$imgs);//写入 fclose($file);//关闭 } return $new_file; } //二维码图片转64进制 function base64EncodeImage ($image_file) { $base64_image = ''; $image_info = getimagesize($image_file); $image_data = fread(fopen($image_file, 'r'), filesize($image_file)); $base64_image =chunk_split(base64_encode($image_data)); return $base64_image; } //删除二维码临时图片 function delDirAndFile($path, $delDir = true) { if (is_array($path)) { foreach ($path as $subPath) delDirAndFile($subPath, $delDir); } if (is_dir($path)) { $handle = opendir($path); if ($handle) { while (false !== ( $item = readdir($handle) )) { if ($item != "." && $item != "..") is_dir("$path/$item") ? delDirAndFile("$path/$item", $delDir) : unlink("$path/$item"); } closedir($handle); if ($delDir) return rmdir($path); } } else { if (file_exists($path)) { return unlink($path); } else { return FALSE; } } clearstatcache(); }