一、開發前准備:
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(); }