Tp5.0后台文件上傳到七牛,以及base64 數據流的上傳


一、開發前准備:

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(); 
} 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM