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