七牛云的使用

七牛云官网:https://www.qiniu.com/

七牛云开发者中心:https://developer.qiniu.com/(有官方SDK、社区SDK、开发者工具、社区插件)

手册:https://developer.qiniu.com/kodo/manual/1277/product-introduction

 

 

申请成功之后的使用:

步骤一:点击对象存储 - 新建存储空间zhongjun

步骤二:新建加速域名:

1)加速域名命名为cdn.zhongjun.windyet.com,

2)源站配置选择里面步骤一里面创建的zhongjun,如下:

 

 

步骤三:去阿里云后台解析域名:cdn.zhongjun.windyet.com,选择CNAME的方式,记录值为七牛云的分配的值。:

1)七牛云的信息:

2)阿里云的配置:

 

步骤四:等到七牛云对象存储的融合CDN域名加速显示成功,就可以使用了。

 

步骤五:进行测试。存储空间 - 内容管理 - 上传文件,然后上传一张图片,并使用cdn.zhongjun.windyet.com/images/1.jpg进行访问。能够访问图片。

 

步骤六:单图上传和ueditor的使用。请参考文章:ueditor的使用。

 

 

上传的基础知识:当你创建的空间在不同的区域的时候,你的上传地址得填入不同的。

客户端上传流程:先从服务器获取凭证,然后依据凭证去七牛云上传资源。

客户端下载资源:公开的不需要凭证,私有的需要从服务器获取凭证。(AK/SK只存在服务端上。)

 

 

 

—————接下来,我们要实现从客户端直接上传单张图片到七牛云并返回地址的功能:—————

1、执行

composer require qiniu/php-sdk

——获取七牛的php-sdk,

 

2、后端执行以下代码生成upToken,并返回:

<?php

namespace app\admin\controller;

use think\Controller;
use \Qiniu\Auth;

require VENDOR_PATH . 'qiniu/php-sdk/autoload.php';

class Test extends Controller
{

    public function getToken()
    {
        $auth = new Auth(config('qiniu.accessKey'), config('qiniu.secretKey'));
        $upToken = $auth->uploadToken(config('qiniu.bucket'));
        return json(['uptoken'=>$upToken]);
    }

}

 

————其中accessKey和secretKey都直接在配置文件里面设置

 

 

 

3、下载前端使用的js-sdk,访问:https://github.com/qiniu/js-sdk/获得:

html部分:

<div id="container">
    <a class="btn btn-default btn-lg " id="pickfiles" href="">
        <i class="glyphicon glyphicon-plus"></i>
        <span>选择文件</span>
    </a>
</div>
<div class="img">
    <img style="width: 300px;" src="" alt="">
</div>

JS部分:

<!--JS部分-->
{block name="script"}
<script src="__COMMON__/qiniu-js-sdk/src/plupload/moxie.js"></script>
<script src="__COMMON__/qiniu-js-sdk/src/plupload/plupload.dev.js"></script>
<script src="__COMMON__/qiniu-js-sdk/dist/qiniu.min.js"></script>

<script>
    var uploader = Qiniu.uploader({
        runtimes: 'html5,flash,html4',    //上传模式,依次退化
        browse_button: 'pickfiles',       //上传选择的点选按钮,**必需**
        uptoken_url: "/admin/test/gettoken",       //Ajax请求upToken的Url,**强烈建议设置**(服务端提供)
        // uptoken : '<Your upload token>', //若未指定uptoken_url,则必须指定 uptoken ,uptoken由其他程序生成
        unique_names: true, // 默认 false,key为文件名。若开启该选项,SDK为自动生成上传成功后的key(文件名)。
        // save_key: true,   // 默认 false。若在服务端生成uptoken的上传策略中指定了 `sava_key`,则开启,SDK会忽略对key的处理
        domain: '{$cdnUrl}',   //bucket 域名,下载资源时用到,**必需**
//        domain: 'http://qiniu-plupload.qiniudn.com/',   //bucket 域名,下载资源时用到,**必需**(暂时不需要下载资源)
        get_new_uptoken: false,  //设置上传文件的时候是否每次都重新获取新的token
        container: 'container',           //上传区域DOM ID,默认是browser_button的父元素,
        max_file_size: '100mb',           //最大文件体积限制
        flash_swf_url: 'js/plupload/Moxie.swf',  //引入flash,相对路径
        max_retries: 3,                   //上传失败最大重试次数
        dragdrop: true,                   //开启可拖曳上传
        drop_element: 'container',        //拖曳上传区域元素的ID,拖曳文件或文件夹后可触发上传
        chunk_size: '4mb',                //分块上传时,每片的体积
        auto_start: true,                 //选择文件后自动上传,若关闭需要自己绑定事件触发上传
        init: {
            'FilesAdded': function (up, files) {
                plupload.each(files, function (file) {
                    // 文件添加进队列后,处理相关的事情
                });
            },
            'BeforeUpload': function (up, file) {
                // 每个文件上传前,处理相关的事情
            },
            'UploadProgress': function(up, file) {
                // 每个文件上传时,处理相关的事情
                $('#pickfiles').prop('disabled', true).html('图片上传中...');
            },
            'FileUploaded': function(up, file, info) {
                // 每个文件上传成功后,处理相关的事情
                // 其中 info.response 是文件上传成功后,服务端返回的json,形式如
                // {
                //    "hash": "Fh8xVqod2MQ1mocfI4S4KpRL6D98",
                //    "key": "gogopher.jpg"
                //  }
                // 参考http://developer.qiniu.com/docs/v6/api/overview/up/response/simple-response.html
                $('#pickfiles').prop('disabled', false).html('上传图片');
                var domain = up.getOption('domain');
                var res = JSON.parse(info.response);
                var sourceLink = domain + res.key; //获取上传成功后的文件的Url
//                alert(sourceLink);
                $('.img img')[0].src = sourceLink;
            },
            'Error': function(up, err, errTip) {
                //上传出错时,处理相关的事情
                $('#pickfiles').prop('disabled', false).html('上传图片');
                layer.alert('出错了!');
            },
            'UploadComplete': function () {
                //队列文件处理完毕后,处理相关的事情
            },
            'Key': function (up, file) {
                // 若想在前端对每个文件的key进行个性化处理,可以配置该函数
                // 该配置必须要在 unique_names: false , save_key: false 时才生效

                var key = "";
                // do something with key here
                return key
            }
        }
    });
</script>

{/block}

 

 

 

以下为完整的例子:添加活动:前端界面的示例:

{extend name="base" /}

<!--右侧主区域-->
{block name="main"}
<div class="row">
    <div class="col-sm-offset-2 col-sm-8">
        <div class="form-group">
            <label for="">活动标题:</label>
            <input type="text" class="form-control title" value="">
        </div>
        <div id="container">
            <a class="btn btn-primary" id="pickfiles" href="">
                <!--<i class="glyphicon glyphicon-plus"></i>-->
                <span>上传封面图</span>
            </a>(宽高比:7:3)
        </div>
        <div class="img">
            <img style="width: 300px;" calss="cover-img-url" src="" alt="">
        </div>
        <div class="form-group">
            <label for="">活动简介:</label>
            <input type="text" class="form-control summary" value="">
        </div>
        <div class="form-group">
            <label for="">文章正文:</label>
            <!--可以在以下直接填充初始化内容-->
            <script id="ueditor" name="content" class="content" type="text/plain"></script>
            <!-- 配置文件 -->
            <script type="text/javascript" src="/static/common/qiniu_ueditor_1.4.3-master/ueditor.config.js"></script>
            <!-- 编辑器源码文件 -->
            <script type="text/javascript" src="/static/common/qiniu_ueditor_1.4.3-master/ueditor.all.js"></script>
            <!-- 实例化编辑器 -->
            <script type="text/javascript">
                var ue = UE.getEditor('ueditor');
            </script>
        </div>
        <div class="form-group">
            <label for="">备注:</label>
            <input type="text" class="form-control mark" value="">
        </div>

        <button class="btn btn-primary submit">确认添加</button>
    </div>
</div>
{/block}

<!--JS部分-->
{block name="script"}
<script src="__COMMON__/qiniu-js-sdk/src/plupload/moxie.js"></script>
<script src="__COMMON__/qiniu-js-sdk/src/plupload/plupload.dev.js"></script>
<script src="__COMMON__/qiniu-js-sdk/dist/qiniu.min.js"></script>
<script>
    //单图(封面图)上传的设置
    var uploader = Qiniu.uploader({
        runtimes: 'html5,flash,html4',    //上传模式,依次退化
        browse_button: 'pickfiles',       //上传选择的点选按钮,**必需**
        uptoken_url: "/admin/qiniu/gettoken",       //Ajax请求upToken的Url,**强烈建议设置**(服务端提供)
        // uptoken : '<Your upload token>', //若未指定uptoken_url,则必须指定 uptoken ,uptoken由其他程序生成
        unique_names: true, // 默认 false,key为文件名。若开启该选项,SDK为自动生成上传成功后的key(文件名)。
        // save_key: true,   // 默认 false。若在服务端生成uptoken的上传策略中指定了 `sava_key`,则开启,SDK会忽略对key的处理
        domain: '{$cdnUrl}',   //bucket 域名,下载资源时用到,**必需**
        //domain: 'http://qiniu-plupload.qiniudn.com/',   //bucket 域名,下载资源时用到,**必需**
        get_new_uptoken: false,  //设置上传文件的时候是否每次都重新获取新的token
        container: 'container',           //上传区域DOM ID,默认是browser_button的父元素,
        max_file_size: '100mb',           //最大文件体积限制
        flash_swf_url: 'js/plupload/Moxie.swf',  //引入flash,相对路径
        max_retries: 3,                   //上传失败最大重试次数
        dragdrop: true,                   //开启可拖曳上传
        drop_element: 'container',        //拖曳上传区域元素的ID,拖曳文件或文件夹后可触发上传
        chunk_size: '4mb',                //分块上传时,每片的体积
        auto_start: true,                 //选择文件后自动上传,若关闭需要自己绑定事件触发上传
        init: {
            'FilesAdded': function (up, files) {
                plupload.each(files, function (file) {
                    // 文件添加进队列后,处理相关的事情
                });
            },
            'BeforeUpload': function (up, file) {
                // 每个文件上传前,处理相关的事情
            },
            'UploadProgress': function (up, file) {
                // 每个文件上传时,处理相关的事情
                $('#pickfiles').prop('disabled', true).html('图片上传中...');
            },
            'FileUploaded': function (up, file, info) {
                // 每个文件上传成功后,处理相关的事情
                // 其中 info.response 是文件上传成功后,服务端返回的json,形式如
                // {
                //    "hash": "Fh8xVqod2MQ1mocfI4S4KpRL6D98",
                //    "key": "gogopher.jpg"
                //  }
                // 参考http://developer.qiniu.com/docs/v6/api/overview/up/response/simple-response.html
                $('#pickfiles').prop('disabled', false).html('更改封面图');
                var domain = up.getOption('domain');
                var res = JSON.parse(info.response);
                var sourceLink = domain + res.key; //获取上传成功后的文件的Url
//                alert(sourceLink);
                $('.img img')[0].src = sourceLink;
            },
            'Error': function (up, err, errTip) {
                //上传出错时,处理相关的事情
                $('#pickfiles').prop('disabled', false).html('上传封面图');
                layer.alert('出错了!');
            },
            'UploadComplete': function () {
                //队列文件处理完毕后,处理相关的事情
            },
            'Key': function (up, file) {
                // 若想在前端对每个文件的key进行个性化处理,可以配置该函数
                // 该配置必须要在 unique_names: false , save_key: false 时才生效

                var key = "";
                // do something with key here
                return key
            }
        }
    });

    $('.submit').click(function () {
        var title = $('.title').val();
        var coverImgUrl = $('.img img')[0].src;
        var summary = $('.summary').val();
        var content = UE.getEditor('ueditor').getContent();
        var mark = $('.mark').val();
        if(mark.length > 4){
            layer.alert('标注超过4个汉字');
            return false;
        }
        $.ajax({
            type: "POST",
            url: "{:url('admin/activity/activityAdd')}",
            data: {
                title: title,
                cover_img_url: coverImgUrl,
                summary: summary,
                content: content,
                mark: mark,
            },
            dataType: "json",
            timeout: 3000,
            success: function (data) {
                if (data == 'success') {
                    layer.alert('添加文章成功!', function(){
                        window.location.href = "{:url('admin/activity/activityList')}";
                    });
                }else {
                    layer.alert('添加失败!');
                }
            }
        });
    })

</script>
{/block}

 

 

 

 

 

——————————web前端使用七牛云直传————————

html部分
<!--图片区域-->
<div class="input-bg" style="text-align: left;">
    <div id="upimg-title">上传图片</div>
    <div class="photo-list weui-row">
        <!--插入图片的实例-->
        <!--<div class="photo-frame">-->
            <!--<img class="photo" src="http://cdn.zhongjun.windyet.com/o_1c1uma3vuou21ooi1e5hjqhqmdc.jpg" alt="">-->
            <!--<span class="weui-icon-cancel del"></span>-->
        <!--</div>-->
        <div class="photo-frame" id="container">
            <img id="pickfiles" src="/static/common/images/add.png"/>
        </div>
    </div>
</div>
<!--图片区域结束-->



JS部分:

<!--直传到七牛云开始-->
<script src="__COMMON__/qiniu-js-sdk/src/plupload/moxie.js"></script>
<script src="__COMMON__/qiniu-js-sdk/src/plupload/plupload.dev.js"></script>
<script src="__COMMON__/qiniu-js-sdk/dist/qiniu.min.js"></script>
<script>
    var arr = [];
    var uploader = Qiniu.uploader({
        runtimes: 'html5,flash,html4',    //上传模式,依次退化
        browse_button: 'pickfiles',       //上传选择的点选按钮,**必需**
        uptoken_url: "/admin/qiniu/gettoken",       //Ajax请求upToken的Url,**强烈建议设置**(服务端提供)
        unique_names: true, // 默认 false,key为文件名。若开启该选项,SDK为自动生成上传成功后的key(文件名)。
        // save_key: true,   // 默认 false。若在服务端生成uptoken的上传策略中指定了 `sava_key`,则开启,SDK会忽略对key的处理
        domain: '{$cdnUrl}',   //bucket 域名,下载资源时用到,**必需**
        get_new_uptoken: false,  //设置上传文件的时候是否每次都重新获取新的token
        container: 'container',           //上传区域DOM ID,默认是browser_button的父元素,
        max_file_size: '100mb',           //最大文件体积限制
        flash_swf_url: 'js/plupload/Moxie.swf',  //引入flash,相对路径
        max_retries: 3,                   //上传失败最大重试次数
        dragdrop: true,                   //开启可拖曳上传
        drop_element: 'container',        //拖曳上传区域元素的ID,拖曳文件或文件夹后可触发上传
        chunk_size: '4mb',                //分块上传时,每片的体积
        auto_start: true,                 //选择文件后自动上传,若关闭需要自己绑定事件触发上传
        init: {
            'FilesAdded': function (up, files) {
                plupload.each(files, function (file) {
                    // 文件添加进队列后,处理相关的事情
                });
            },

            'BeforeUpload': function (up, file) {
                // 每个文件上传前,处理相关的事情
            },

            'UploadProgress': function (up, file) {
                // 每个文件上传时,处理相关的事情
//                $('#pickfiles').prop('disabled', true).html('图片上传中...');
            },

            'FileUploaded': function (up, file, info) {
                // 每个文件上传成功后,处理相关的事情
                // 其中 info.response 是文件上传成功后,服务端返回的json
                // 参考http://developer.qiniu.com/docs/v6/api/overview/up/response/simple-response.html
                $('#pickfiles').prop('disabled', false).html('上传图片');
                var domain = up.getOption('domain');
                var res = JSON.parse(info.response);
                var sourceLink = domain + res.key; //获取上传成功后的文件的Url
                $('.photo-list').prepend('<div class="photo-frame"><img class="photo" src="' + sourceLink + '" alt=""><span class="weui-icon-cancel del"></span></div>');
            },

            'Error': function (up, err, errTip) {
                //上传出错时,处理相关的事情
                $('#pickfiles').prop('disabled', false).html('上传图片');
                $.alert('出错了!');
            },

            'UploadComplete': function () {
                //队列文件处理完毕后,处理相关的事情
            },

            'Key': function (up, file) {
                // 若想在前端对每个文件的key进行个性化处理,可以配置该函数
                // 该配置必须要在 unique_names: false , save_key: false 时才生效

                var key = "";
                // do something with key here
                return key
            }
        }
    });
</script>

 

 

 

 

——————不使用插件,直接使用表单直传(ajax或表单提交都可以) ——————

 html部分

<form id="uploadForm" enctype="multipart/form-data">
    <input name="token" class="token" type="hidden" value="">
    <input name="file" type="file" />
</form>
<button id="upload">上传文件</button>

JS部分:<= 演示ajax部分,其实可以直接表单提交的。

// 获取七牛云token,并放入input框中
$.ajax({
    type: "GET",
    url: "{{:url('/backend/qiniu/get_token')}}",
    data: {
    },
    success: function (res) {
        console.log(res);
        $('.token').val(res);
    }
});

// 模拟上传
$("#upload").click(function () {
    var formData = new FormData($('#uploadForm')[0]);
    alert(222);
    $.ajax({
        type: 'post',
        url: "http://upload.qiniup.com/",
        data: formData,
        success: function (res) {
            console.log(res);
//                console.log('http://cdn.smartcommunity.windyet.com/'+res.key);
        }
    })
});

————返回值有个hash和key,域名+key就是图片的地址了。

 

 

 

————占位符

 

posted @ 2017-11-09 17:04  小寒1206  阅读(883)  评论(0编辑  收藏  举报