Laravel中前端js上传图片到七牛云的示例代码


Posted in PHP onSeptember 04, 2017

以下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.创建一个选择文件的按钮

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

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

这里差不多就可以啦,更多的操作参考文档七牛云官方js文档

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
FCKeditor添加自定义按钮
Mar 27 PHP
PHP集成FCK的函数代码
Sep 27 PHP
解析thinkphp中的M()与D()方法的区别
Jun 22 PHP
解析php根据ip查询所在地区(非常有用,赶集网就用到)
Jul 01 PHP
php中{}大括号是什么意思
Dec 01 PHP
ThinkPHP单字母函数(快捷方法)使用总结
Jul 23 PHP
php中substr()函数参数说明及用法实例
Nov 15 PHP
PHP实现上传文件并存进数据库的方法
Jul 16 PHP
日常整理PHP中简单的图形处理(经典)
Oct 26 PHP
详谈PHP面向对象中常用的关键字和魔术方法
Feb 04 PHP
在Mac OS下搭建LNMP开发环境的步骤详解
Mar 10 PHP
关于Laravel参数验证的一些疑与惑
Nov 19 PHP
使用YII2框架实现微信公众号中表单提交功能
Sep 04 #PHP
PHP实现批量重命名某个文件夹下所有文件的方法
Sep 04 #PHP
PHP读取、解析eml文件及生成网页的方法示例
Sep 04 #PHP
PHP钩子与简单分发方式实例分析
Sep 04 #PHP
PHP实现登录注册之BootStrap表单功能
Sep 03 #PHP
[原创]PHP实现生成vcf vcard文件功能类定义与使用方法详解【附demo源码下载】
Sep 02 #PHP
php简单读取.vcf格式文件的方法示例
Sep 02 #PHP
You might like
Banner程序
2006/10/09 PHP
php数组函数序列之ksort()对数组的元素键名进行升序排序,保持索引关系
2011/11/02 PHP
php使用filter过滤器验证邮箱 ipv6地址 url验证
2013/12/25 PHP
PHP设计模式之单例模式定义与用法分析
2019/03/26 PHP
JS操作XML中DTD介绍及使用方法分析
2019/07/04 PHP
Laravel 之url参数,获取路由参数的例子
2019/10/21 PHP
qTip 基于JQuery的Tooltip插件[兼容性好]
2010/09/01 Javascript
基于jquery的无刷新分页技术
2011/06/11 Javascript
jquery实现图片随机排列的方法
2015/05/04 Javascript
纯js代码实现简单计算器
2015/12/02 Javascript
JavaScript实现瀑布流布局
2020/06/28 Javascript
PassWord输入框代码分享
2016/06/07 Javascript
js前端面试题及答案整理(一)
2016/08/26 Javascript
Angualrjs和bootstrap相结合实现数据表格table
2017/03/30 Javascript
Angular4.0中引入laydate.js日期插件的方法教程
2017/12/25 Javascript
Node.js上传文件功能之服务端如何获取文件上传进度
2018/02/05 Javascript
AngularJS上传文件的示例代码
2018/11/10 Javascript
[02:56]DOTA2上海特锦赛小组赛解说FreeAgain采访花絮
2016/02/27 DOTA
Python向MySQL批量插数据的实例讲解
2018/03/31 Python
详解将Pandas中的DataFrame类型转换成Numpy中array类型的三种方法
2019/07/06 Python
python cumsum函数的具体使用
2019/07/29 Python
Pycharm最新激活码2019(推荐)
2019/12/31 Python
Python 实现一个计时器
2020/07/28 Python
Css3圆角边框制作代码
2015/11/18 HTML / CSS
你可能不熟练的十个前端HTML5经典面试题
2018/07/03 HTML / CSS
HTML利用九宫格原理进行网页布局
2020/03/13 HTML / CSS
澳大利亚第一的设计师礼服租赁网站:GlamCorner
2017/08/13 全球购物
Saucony澳大利亚官网:美国跑鞋品牌,运动鞋中的劳斯莱斯
2018/05/05 全球购物
施华洛世奇巴西官网:SWAROVSKI巴西
2019/12/03 全球购物
校园活动策划方案
2014/06/13 职场文书
服务宗旨标语
2014/07/01 职场文书
党支部反对四风思想汇报
2014/10/10 职场文书
2015年创先争优工作总结
2015/05/23 职场文书
如何撰写出一份完美的商业计划书?
2019/07/12 职场文书
vue 实现上传组件
2021/05/31 Vue.js
Mysql使用全文索引(FullText index)的实例代码
2022/04/03 MySQL