一、开发前准备:
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();
}
