Laravel架構中javascript上傳圖片到七牛雲的案例詳解

來源:互聯網
上載者:User
以下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配置好你的七牛資訊


<?phpreturn [  //...  '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();});

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.