七牛云调用类

基于thinkphp5.0.15, 可以扩展数据库保存
自己了个七牛云调用类,用的是官方SDK 7.2.3 直接将文件放到Qinui里
将整个Qinui文件夹放到 extend 即可。

<?php
namespace Qiniu;
require "functions.php";
//use app\index\model\AdminImg;
use Qiniu\Storage\BucketManager;
use Qiniu\Storage\UploadManager;
use Think\Config;
/**
 * 七牛云 使用类
 */
class Qnycn{
    protected $accessKey ;//七牛云 访问ID
    protected $secretKey ;//七牛云 访问密钥
    protected $bucket;//空间名
    protected $url;//空间对应的网址
    protected $imgUrlArray;//上传返回的
    /**
     * 文件的前缀 以字母开头 /结束 prefix 如: 'image/jpg/'
     * 可以在构造函数中用用户呢称取得配置
     */
    public $prefix='' ;

    /**
     * 图片上传配置,可在构造函数中从系统取值,不过就要去掉 static属性
     */
    static private $imgconfig=array(
        'types' => '.gif|.jpeg|.png|.bmp|.jpg',//图片类型
        'size'  => 2*1024*1024//文件大小 2M
    );

    /**
     * 构造函数
     * 自动的初始化密钥和空间域名
     * 可以在这里通过数据库处理这些
     * @param  string  $prefix
     */
    public function __construct($prefix=null)
    {
        $this->accessKey = Config::get('appkey.qnyaccessKey');
        $this->secretKey = Config::get('appkey.qnysecretKey');
        $this->bucket    = Config::get('appkey.qnybucket');
        $this->url       = Config::get('appkey.qnyurl');
        if($prefix){
            (substr($prefix,-1) == '/')? $prefix : $prefix.'/';
        }
    }

    public  function __get($name)
    {
        return $this->$name;
    }

    /**
     * 我的想法是多张图片上传,将返回的图片信息在最后保存到数据库
     * */
    public function __destruct()
    {
        //trace('bb','aaa');
    }

    /**
     * 网上抓取
     * @access public
     * @param  string  $url 网络上的图片地址
     * @param  string  $suffix 文件后缀 默认JPG
     * @return string $imgurl  图片地址
     */
    public function fetchImg($url,$suffix='jpg')
    {
        $auth = new Auth($this->accessKey, $this->secretKey);
        $bucketManager = new BucketManager($auth);
        $key=date('YmdHis').rand(10000, 99999).'.'.$suffix;
        list($ret, $err) = $bucketManager->fetch($url, $this->bucket, $key);
        if ($err == null) {
            $this->saveToDB($ret['key']);
            return $this->url.$ret['key'];
        }
    }

    /**
     * 取得上传的Token
     * @access public
     * @param  string  $url 网络上的图片地址
     * @param  string  $suffix 文件后缀 默认JPG
     * @return string $imgurl  图片地址
     */
    public function authUploadToken()
    {
        //设置了回调地址,前端就不会返回值了。
        $expires=array(
            'returnBody'=>'{"key":"'.$this->url.'$(key)","hash":"$(etag)","fsize":$(fsize),"name":"$(x:name)"}',
            'callbackUrl' => 'https://www.wyx2013.cn/wxapi/qiniucallback',
            'callbackBody' => '{"key":"$(key)","hash":"$(etag)","fsize":$(fsize),"bucket":"$(bucket)","name":"$(x:name)","user":"admin"}',
            'callbackBodyType' => 'application/json'
        );
        $auth = new Auth($this->accessKey, $this->secretKey);
        return $auth->uploadToken($this->bucket, null,600, $expires);//前端上传,第三个参数为时间,不用太长
    }

    /**
     * 图片上传
     * @access public
     * @param  array  $file  一个单图就是$_FILES[key] 含以下信息
     * ["name"]=> string(9) "TS 37.jpg"
     * ["type"] =&gt; string(10) "image/jpeg"
     * ["tmp_name"] =&gt; string(14) "/tmp/phpAuVNJu"
     * ["error"] =&gt; int(0)
     * ["size"] =&gt; int(423024)
     * 如果是单图上传 $keys = array_keys($_FILES);
     * $key=$keys[0];
     * if($_FILES[$key]['error'] == 0)
     * $CLASS->->uploadimg($_FILES[$key]);
     *
     * @return string $imgurl  图片地址
     */
    public function uploadimg($file)
    {
        $suffix=$this->checkimgfile($file['name'],$file['size']);
        if($suffix){
            $img=$this->uploadFile($file['tmp_name'],$suffix);
            $imgurl=$this->url.$img;
            $this->imgUrlArray[]=$img;
            return $imgurl;//返回的是一张图片的地址
        }
    }

    /**
     * 多图上传 适用于 multiple 一定要加上
     * <input id="ajaxfiles" type="file" name="file[]" multiple="multiple" />
     * @access public
     * @param  string  $file  <input type="file"  name="file[]"  multiple="multiple">中的name值 不包括[]
     * @return array $imgurlarray  图片地址数组
     */
    public function uploadimgs($file='files')
    {
        $c=count($_FILES[$file]['error']);
        for($i=0;$i<$c;++$i){
            $suffix=$this->checkimgfile($_FILES[$file]['name'][$i],$_FILES[$file]['size'][$i]);
            if($suffix){
                $img=$this->uploadFile($_FILES[$file]['tmp_name'][$i],$suffix);
                if($img){
                    $imgurlarray[]=$this->url.$img;
                }
            }
        }
        $this->saveToDB($imgurlarray);
        return $imgurlarray;//调用此方法,返回的是数组
    }

    /**
     * 文件删除
     * @access public
     * @param  string  $key  图片在空间的KEY值
     * @return boolean 成功true 失败 false
     */
    public function delete($key='')
    {
        $auth = new Auth($this->accessKey, $this->secretKey);// 构建鉴权对象
        $bucketMgr = new BucketManager($auth);//初始化BucketManager
        $err = $bucketMgr->delete($this->bucket, $key);
        return $err ? true : false ;
    }

    /**
     * 文件列表
     * @access public
     * @param  Boolean  $c  值为真即返 回数组 为假返回总数量
     * @return array or int
     */
    public function listFiles($c = false )
    {
        $auth = new Auth($this->accessKey, $this->secretKey);// 构建鉴权对象
        $bucketMgr = new BucketManager($auth);
        $bucket=$this->bucket;
        $prefix = 'image/jpg/';//前缀
        $marker = '';//标记
        $limit = 10000;//条数
        $delimiter = '/';//指定目录分隔符
        list($iterms, $err) = $bucketMgr->listFiles($bucket, $prefix, $marker, $limit, $delimiter);
        if ($err !== null) {
            return false;//没有文件返回空
        } else {
            if($c){ return $iterms;  }else{ return count($iterms); }
        }
    }

    /**
     * 图片检测并返回后缀
     * @access private
     * @param  string  $name  图片名
     * @param  int  $size  图片大小
     * @return string $suffix图片后缀
     */
    public function checkimgfile($name,$size)
    {
        $suffix=pathinfo($name, PATHINFO_EXTENSION); //取得后缀
        if(stripos(self::$imgconfig['types'],$suffix) && $size<self::$imgconfig['size']){
            return $suffix;
        }else{
            return false;
        }
    }

    /**
     * 文件上传
     * @access private
     * @param  file $fileOjb 本地临时文件地址
     * @param  string  $suffix  文件后缀
     * @return mixed 成功上传 返回文件的名
     */
    private function uploadFile($fileOjb,$suffix )
    {
        $auth = new Auth($this->accessKey, $this->secretKey);// 构建鉴权对象
        $bucket = $this->bucket;// 要上传的空间
        $token = $auth->uploadToken($bucket);// 生成上传 Token
        $uploadMgr = new UploadManager();// 构建 UploadManager 对象
        $key=date('YmdHis').rand(10000, 99999) . '.' . $suffix;//文件名 用时间命名
        $key=empty($this->prefix) ? $key : $this->prefix.$key;
        list($ret, $err) = $uploadMgr->putFile($token, $key, $fileOjb);//上传
        return ($err !== null)? false : $ret['key'];
    }

    /**
     * 将图片保存到表格里面
     * @access private
     * @param  string array  $img  单个图片为或多个图片名
     * @return mixed
     */
    private function saveToDB($img )
    {
        //$m=new AdminImg();
        if(is_string($img)){
            //$m->img=$img;
            //$m->imgurl=$imgurl;
            //$m->save();
        }elseif(is_array($img)){
            $url=$this->url;
            foreach($img as $value){
                $data[]=array('img'=>$value,'imgurl'=>$url.$value);
            }
            //$m->saveAll($data);
        }
    }
}

这里只封装了部分功能

上传文件

返回值为[{"suc":"http:// xample.com/2018033122531446150.png"},{"suc":"xxxx"}]

public function ajaxuploadimgs()
    {
        if ( !empty($_FILES) ) {
        $q = new Qnycn();
        foreach ($_FILES as $key=>$file){
                if ($file['error'] !== 0) {
                    continue;
                } else {
                    
                    $imgurl = $q->uploadimg($file,$key);
                    if($imgurl){
                        $c[] = array('suc'=>$imgurl);
                    }else{
                        $c = array('err'=>'七牛云上传失败');
                    }
                }
            }
            return json_encode($c);
        }
         return false;
    }

如果是多个图片上传会产生一个问题,会调用多次类,可以将调用方也写到Qnycn的类里面。
附上jQuery上传代码。


<script>
    $(document).ready(function(){
        $("#ajaxfiles").change(function() {
            var paths = document.getElementById("ajaxfiles").files;
            var formData=new FormData();
            for(var i=0;i<paths.length;i++){
                //将每个文件设置一个string类型的名字,放入到formData中,这里类似于setAttribute("",Object)
                formData.append(paths[i].name,paths[i]);
            }
            $.ajax({
                url: "/admin/ajaxuploadimgs",
                type: 'POST',
                data: formData,
                dataType:"json",
                processData: false,
                contentType: false,
                success: function (date) {
                    $.each(date, function(i, item){
                        if(item.suc){
                            alert(tem.suc);
                        }else {
                            alert(item.err);
                        }
                    });
                }
            });
        });
    });
<script>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,064评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,606评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,011评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,550评论 1 269
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,465评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,919评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,428评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,075评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,208评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,185评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,191评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,914评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,482评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,585评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,825评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,194评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,703评论 2 339

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,227评论 25 707
  • 2017年 12月25日 星期一 天气晴 随着政策的不断完善,我也要为以后的退休做铺垫。将我五险一金完善起来。 今...
    轻松韩阅读 144评论 0 0
  • 睡眠成为一种竞争力,较量的是如何保证优质的睡眠,还能实现自己的学习工作,生活处于稳健的状态。 -01- 首先问自己...
    彩红fy阅读 1,113评论 5 27
  • 1、功能说明:ConvertToUTF8 能将除UTF8编码之外的其他编码文件在 Sublime Text 中转换...
    洁琼_3c71阅读 959评论 0 0
  • 你的儿女,其实不是你的儿女。 他们是生命对于自身渴望而诞生的孩子。 他们借助于你来到这个世界,却非因你而来。 他们...
    快乐一家亲阅读 218评论 0 0