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