• 技术文章 >后端开发 >php教程

    Laravel框架中javascript上传图片到七牛云的案例详解

    黄舟黄舟2017-09-05 09:07:40原创674
    以下Laravel中使用浏览器端上传图片到七牛云,下面只是做一些简单的流程实例。

    1. 首先引入相应的js文件,下面是通过CDN引入的StaticfileCDN,当然也有其他很多方式下载, bower,git,官网的SDK
    七牛js基于Plupload插件封装,所以需要下载Plupload,建议使用 2.1.1 ~ 2.1.9。


    <script src="https://cdn.staticfile.org/jquery/2.2.1/jquery.min.js"></script>
    <script src="https://cdn.staticfile.org/plupload/2.1.9/moxie.js"></script>
    <script src="https://cdn.staticfile.org/plupload/2.1.9/plupload.dev.js"></script>
    <script src="https://cdn.staticfile.org/qiniu-js-sdk/1.0.14-beta/qiniu.min.js"></script>

    2.创建一个选择文件的按钮


      <p id="container">
        <a class="btn btn-default btn-lg " id="pickfiles" href="#" rel="external nofollow" >
          <span>选择文件</span>
        </a>
      </p>

    3.初始化 uploader

    (请确保在执行初始化时,页面已经引入 plupload),这里我们需要一个uptoken上传凭证,这个需要php后端生成提供。一会下面我们来说怎么获取token。


      function uploaderReady(token) {
        console.log(token);
        var uploader = Qiniu.uploader({
          runtimes: 'html5,flash,html4',   // 上传模式,依次退化
          browse_button: 'pickfiles',   //上传按钮的ID
          uptoken: token, // uptoken是上传凭证,由其他程序生成
         // uptoken_url: '/uptoken',    // Ajax请求uptoken的Url,强烈建议设置(服务端提供)
         // uptoken_func: function(){    // 在需要获取uptoken时,该方法会被调用
         //  // do something
         //  return uptoken;
         // },
          get_new_uptoken: false,       // 设置上传文件的时候是否每次都重新获取新的uptoken
          unique_names: true,       // 默认false,key为文件名。若开启该选项,JS-SDK会为每个文件自动生成key(文件名)
          //save_key: true,         // 默认false。若在服务端生成uptoken的上传策略中指定了sava_key,则开启,SDK在前端将不对key进行任何处理
          domain: 'http://ovngj7u9c.bkt.clouddn.com',  // bucket域名,下载资源时用到,必需
          container: 'container',       // 上传区域DOM ID,默认是browser_button的父元素
          max_file_size: '100mb',       // 最大文件体积限制
          flash_swf_url: 'path/of/plupload/Moxie.swf', //引入flash,相对路径
          max_retries: 1,           // 上传失败最大重试次数
          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) {
              // 每个文件上传时,处理相关的事情
            },
            'FileUploaded': function (up, file, info) {
              // 每个文件上传成功后,处理相关的事情
              // 其中info是文件上传成功后,服务端返回的json,形式如:
              // {
              //  "hash": "Fh8xVqod2MQ1mocfI4S4KpRL6D98",
              //  "key": "gogopher.jpg"
              // }
              // 获取url路径 传入后台保存到数据库
               var domain = up.getOption('domain');
               var url = JSON.parse(info);
               var sourceLink = domain +"/"+ url.key;
    
               $.ajax({
                url: '/image',
                type: 'POST',
                dataType : 'json',
                data: {
                  '_token':"{{ csrf_token() }}",
                  "url":sourceLink
                },
               });
            },
            'Error': function (up, err, errTip) {
              console.log(errTip);
            },
            'UploadComplete': function () {
              //队列文件处理完毕后,处理相关的事情
            },
            'Key': function (up, file) {
              // 若想在前端对每个文件的key进行个性化处理,可以配置该函数
              // 该配置必须要在unique_names: false,save_key: false时才生效
              var key = "";
              // do something with key here
              return key
            }
          }
        });
      }

    4.后端获取上传凭证token

    首先我们先去安装一个七牛的packagist,github地址。


    composer require "overtrue/laravel-filesystem-qiniu" -vvv

    在app/config.php里面添加


    'providers' => [
      // Other service providers...
      Overtrue\LaravelFilesystem\Qiniu\QiniuStorageServiceProvider::class,
    ],

    然后在config/filesystems.php配置好你的七牛信息


    <?php
    
    return [
      //...
      'qiniu' => [
        'driver'   => 'qiniu',
        'access_key' => env('QINIU_ACCESS_KEY', 'xxxxxxxxxxxxxxxx'),
        'secret_key' => env('QINIU_SECRET_KEY', 'xxxxxxxxxxxxxxxx'),
        'bucket'   => env('QINIU_BUCKET', 'test'),
        'domain'   => env('QINIU_DOMAIN', 'xxx.clouddn.com'), // or host: https://xxxx.clouddn.com
      ],
      //...
    ];

    然后在你控制器store方法中写入获取token的代码,一会好让前端用ajax请求获得


    public function store()
    {
      $disk = Storage::disk('qiniu');
      $token = $disk->getUploadToken();
      
      return response()->json(['uptoken'=>$token]);
    }

    5.有了token之后我们继续来完善前端代码

    为了理解我们写一个ajax去请求store,当然你也可以在uploader里的uptoken_url属性设置请求地址。


    function getTokenMessage() {
      $.ajax({
        url: '你的控制器地址',
        type: 'POST',
        data: {'_token':"{{ csrf_token() }}"},
        dataType : 'json',
        success: function (data) {
          var obj = data;
          // 请求成功之后,调用刚刚写好的uploaderReady方法,把token传入过去
          uploaderReady(obj.uptoken);
        }
      });
    }
    //让页面初始化的时候就请求
    $(document).ready(function(){
      getTokenMessage();
    });

    以上就是Laravel框架中javascript上传图片到七牛云的案例详解的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:javascript Laravel js
    上一篇:PHP实现找出有序数组中最小绝对值方法介绍 下一篇:YII2框架的优缺点是什么
    PHP编程就业班

    相关文章推荐

    • 超小PHP小马小结(方便查找后门的朋友)_php实例• 简单示例AJAX结合PHP代码实现登录效果代码_php实例• linux下怎么安装php的扩展库• 大侠一个Smarty的有关问题• 如果输出等号前变量,该如何解决

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网