七牛雲--開發筆記

開發文檔:https://developer.qiniu.com/kodo/sdk/1241/phpphp

1、下載官方SDK :html

 https://github.com/qiniu/php-sdk/releases?ref=developer.qiniu.com前端

下載源代碼包後,解壓到您的項目中。 而後在您的項目中引入 autoloader:html5

 

基本使用方法

安裝好 SDK 後,接下來介紹如何使用 SDK。在使用 SDK 以前,須要註冊一個七牛賬號,並登陸控制檯獲取一對有效的AccessKey和SecretKey,而且詳細閱讀[安全機制][securityHref]以進一步瞭解如何正確使用和管理密鑰。android

 

引入SDK

不管你是經過哪一種方式安裝的 SDK,只須要一句簡單的 require 語句將安裝好的SDK包含到你的項目中。請參考以下表格,找到適合你的安裝方式,將SDK引入到你的項目中。請用你項目中的實際路徑替換 path_to_sdk。git

安裝方式 引入SDK
Composer 安裝 require 'path_to_sdk/vendor/autoload.php';
下載Composer安裝包 require 'path_to_sdk/vendor/autoload.php';
下載源碼安裝包 require 'path_to_sdk/autoload.php';

 

SDK結構

能夠直接查看咱們的SDK目錄,便可大體瞭解咱們SDK的結構。github

  • 最外層包含:配置文件, 鑑權和一些公共的函數。
  • HTTP 目錄主要包含了一些對 http 進行封裝的類,這塊你能夠不用關心。
  • Storage 目錄主要包含兩大塊:Bucket 中文件的管理和文件的上傳。
  • Processing 目錄主要包含文件的處理,文件處理又包含兩個方面:同步處理和異步處理。

爲了幫助您更好的瞭解和使用咱們的sdk,咱們還提供了各類使用示例。 若是使用中遇到問題,能夠經過Github或者咱們的工單進行反饋。下面咱們對一些關鍵點進行簡單的介紹,方便您快速入門。數據庫

 

鑑權類

在使用七牛的SDK的過程當中鑑權是很重要的一塊,不論是上傳鑑權,下載籤權, 仍是回調的籤權。 PHP SDK 中的 Auth 類封裝了全部的鑑權方式。 因此在使用 PHP SDK 時基本都會先對鑑權類進行初始化:編程

  1. <?php
  2. require 'path_to_sdk/vendor/autoload.php';
  3.  
  4. use Qiniu\Auth;
  5.  
  6. // 用於簽名的公鑰和私鑰
  7. $accessKey = 'Access_Key';
  8. $secretKey = 'Secret_Key';
  9.  
  10. // 初始化籤權對象
  11. $auth = new Auth($accessKey, $secretKey);

初始化好Auth 類後,就能夠調用相應的方法了,好比生成私有下載連接方法 privateDownloadUrl,獲取上傳Token方法 uploadToken,驗證回調方法 verifyCallback等。json

 

上傳類

在上傳類 UploadManager 中主要負責文件的上傳, 七牛的文件上傳分爲兩種上傳方式:表單上傳分片上傳。固然在PHP SDK中你不用關心這個細節,只須要調用 UploadManager 中的上傳方法便可。UploadManager 中的上傳方法會根據上傳文件的大小選擇不一樣的上傳方式,小於4MB的進行表單上傳,大於4MB的進行分片上傳。 如下一個簡單的示例使你更清晰地瞭解如何初始上傳對象:

  1. <?php
  2. require 'path_to_sdk/vendor/autoload.php';
  3.  
  4. use Qiniu\Auth;
  5. use Qiniu\Storage\UploadManager;
  6.  
  7. $accessKey = 'Access_Key';
  8. $secretKey = 'Secret_Key';
  9. $auth = new Auth($accessKey, $secretKey);
  10.  
  11. // 空間名 https://developer.qiniu.io/kodo/manual/concepts
  12. $bucket = 'Bucket_Name';
  13.  
  14. // 生成上傳Token
  15. $token = $auth->uploadToken($bucket);
  16.  
  17. // 構建 UploadManager 對象
  18. $uploadMgr = new UploadManager();

空間名請參閱空間

 

資源管理類

在資源管理類 BucketManager 中主要負責空間中文件的管理: 複製,移動,刪除,獲取元信息,修改Mime,拉取文件到七牛空間,列取文件。 如下一個簡單的示例使你更清晰地瞭解如何初始空間管理對象:

  1. <?php
  2. require 'path_to_sdk/vendor/autoload.php';
  3.  
  4. use Qiniu\Auth;
  5. use Qiniu\Storage\BucketManager;
  6.  
  7. $accessKey = 'Access_Key';
  8. $secretKey = 'Secret_Key';
  9.  
  10. //初始化Auth狀態
  11. $auth = new Auth($accessKey, $secretKey);
  12.  
  13. //初始化BucketManager
  14. $bucketMgr = new BucketManager($auth);

 

觸發持久化類

觸發持久化類 PersistentFop 中主要負責對空間中已上傳的文件進行異步處理,並對異步處理的結果進行持久化操做。好比對已上傳的視頻文件進行轉碼,拼接,切片,水印等處理,並將處理後的結果保存在空間中。

  1. <?php
  2.  
  3. require_once __DIR__ . '/../autoload.php';
  4.  
  5. use Qiniu\Auth;
  6. use Qiniu\Processing\PersistentFop;
  7.  
  8. $accessKey = 'Access_Key';
  9. $secretKey = 'Secret_Key';
  10. $auth = new Auth($accessKey, $secretKey);
  11.  
  12. // 要轉碼的文件所在的空間
  13. $bucket = 'Bucket_Name';
  14.  
  15. // 轉碼時使用的隊列名稱
  16. $pipeline = 'abc';
  17.  
  18. // 初始化
  19. $pfop = new PersistentFop($auth, $bucket, $pipeline);

 

場景化示例

接下來咱們,對一些常見的使用場景,提供一些簡單的Demo,使您更快速的接入七牛。

 

Hello, World!

在瞭解了基本概念和編程模型後,咱們如今以最短的篇幅將第一個雲存儲服務的示例程序跑起來。該示例的目標是:將一個本地小文件上傳到指定的存儲空間中。

提交頁面

咱們先寫一個簡單的 HTML 表單來供用戶上傳到七牛存儲空間信息並選擇一個本地文件。在點擊提交按鈕後,瀏覽器會發送一個 HTTP 請求到七牛上傳域名執行文件上傳動做。

  1. <form method="post" action="http://up.qiniu.com" enctype="multipart/form-data">
  2. <input name="token" type="hidden" value="<upload_token>">
  3. <input name="file" type="file" />
  4. <input type="submit" value="上傳"/>
  5. </form>

上傳動做

也許你注意到了這個上傳表單有一個token字段,因此想要使用 form 直傳七牛一個文件,必須在頁面加載的時候,向服務端請求token並設置到這個表單項中。服務端生成這個token涉及到咱們 SDK 中提供的方法:Qiniu\Auth

關鍵代碼以下所示:

  1. use Qiniu\Auth;
  2.  
  3. $bucket = '<your_bucket>';
  4. $accessKey = '<your_access_key>';
  5. $secretKey = '<your_secret_key>';
  6. $auth = new Auth($accessKey, $secretKey);
  7.  
  8. $upToken = $auth->uploadToken($bucket);
  9.  
  10. echo $upToken;

能夠看出,以上代碼主要作了如下幾步工做:

  1. 使用你的 AccessKey 及 SecretKey 用於初始化Auth對象
  2. 調用初始化的對象Auth對象的方法uploadToken來生成上傳token

到這裏爲止,第一個示例就能夠運行起來了。您能夠查看該示例的在線演示。您也能夠直接獲取和查看該示例的源代碼

小結

這個示例僅用於演示如何使用 PHP SDK 快速運行第一個雲存儲服務的程序。本事例儘量簡單的展示七牛的表單上傳,所以請你們僅將本示例做爲學習 PHP SDK 的一個步驟,而不是在產品環境中應用。

 

一個完整的移動應用

咱們將詳細介紹如何使用 PHP SDK 與其餘端配合構建一個相似於微信朋友圈的移動應用。

在這個移動應用裏終端用戶能夠進行以下操做:

  1. 使用預設的賬號密碼登陸(不支持註冊新賬號)
  2. 查看本身和朋友分享的照片以及描述(不支持評論)
  3. 上傳一張新圖片,並添加一段描述。

Demo截圖

整體架構

對於此類應用,咱們推薦的整體架構以下圖所示:

arch-with-callback

對於此架構有如下關鍵要點:

  1. AK/SK 只能在業務服務器端使用,若是將 AK 和 SK 同時保存或者傳輸到移動端會有嚴重的信息泄露風險。
  2. AK/SK 是企業賬號信息,業務服務器須要有本身的賬號數據庫,對應到每個終端用戶的賬號信息。
  3. 因爲不一樣的業務都須要存放一些跟文件相關的描述信息,且圖片又屬於不一樣的終端用戶,所以須要維護文件管理表,以管理文件的描述信息和全部者關係。

基於以上這些關鍵要點,咱們來設計和實現咱們的 PHP 版本的業務服務器。

接口設計

咱們來簡單的設計咱們的業務服務器接口。

賬號驗證:

  1. POST /login.php HTTP/1.1
  2. HOST: demos.qiniu.io
  3. Accept: */*
  4. Content-Type: application/x-www-form-urlencoded
  5.  
  6.  
  7. uname=<username>&pwd=<password>
  8.  

獲取文件列表:

  1. POST /files.php HTTP/1.1
  2. HOST: demos.qiniu.io
  3. Accept: */*
  4. Cookie: <cookie>
  5. Content-Type: application/x-www-form-urlencoded

獲取上傳受權,由於移動端並不知道 AK/SK 信息,客戶端在須要上傳文件時都須要向業務服務器發起一個獲取上傳受權的請求:

  1. POST /uptoken.php HTTP/1.1
  2. HOST: demos.qiniu.io
  3. Accept: */*
  4. Cookie: <cookie>
  5. Content-Type: application/x-www-form-urlencoded

回調,移動端會直接上傳文件到雲存儲服務,所以業務服務器不須要提供上傳接口,可是須要提供一個供雲存儲服務在接收到文件後的回調接口。回調接口的響應內容會由雲存儲服務返回給移動端:

  1. POST /callback.php HTTP/1.1
  2. HOST: demos.qiniu.io
  3. Accept: */*
  4. Cookie: <cookie>
  5. Content-Type: application/x-www-form-urlencoded
  6.  
  7. uid=<uid>&fname=<file_name>&fkey=<file_key>&desc=<description>
  8.  

數據表,業務服務須要一個業務數據庫的支撐以管理提到的賬號信息和文件信息。在本示例中咱們選用 MySQL 來搭建業務數據庫。賬號表:

字段名 字段類型 字段說明
id int 惟一標識。  
uid int 惟一用戶標識。  
uname char(128) 用戶名,格式爲郵箱如 admin@example.com 。  
password char(128) 加密後的密碼。  
status int 1: active 
0: disabled
 

文件信息表:

字段名 字段類型 字段說明
id int 惟一標識。  
uid int 用戶惟一標識。  
fname char(512) 文件的顯示名  
key char(512) 文件對應到雲存儲服務中的惟一標識。  
createTime time 上傳時間。  
description char(2048) 文件的描述內容。  

相應的 SQL 語句以下:

  1. create database qspace;
  2.  
  3. CREATE TABLE users (
  4. uid INT NOT NULL AUTO_INCREMENT,
  5. uname VARCHAR(128) NOT NULL,
  6. password VARCHAR(128) NOT NULL,
  7. status INT,
  8. PRIMARY KEY (uid)
  9. );
  10.  
  11. CREATE TABLE files_info (
  12. id INT NOT NULL AUTO_INCREMENT,
  13. uid INT NOT NULL,
  14. fname VARCHAR(512) NOT NULL,
  15. fkey VARCHAR(512) NOT NULL,
  16. createTime INT,
  17. description VARCHAR(1024),
  18. PRIMARY KEY (id),
  19. FOREIGN KEY (uid) REFERENCES users(uid),
  20. UNIQUE INDEX (id)
  21. );

服務實現

接下來咱們一步步的實現以上定義的接口。這些實現主要考慮流程的完整性,所以在安全性上沒有作充分的考量,請不要直接使用於產品環境中。

配置文件

咱們須要在一個地方存放全局的設置。本示例中咱們直接用一個 config.php 文件包含若干全局變量的方式來解決這個問題。

  1. <?php
  2. class Config
  3. {
  4. const DB_NAME = 'qspace',
  5. DB_USER = 'root',
  6. DB_PWD = '****',
  7. DB_HOST = '<your_db_host>',
  8. ACCESS_KEY = '<your_access_key>',
  9. SECRET_KEY = '<your_secret_key>',
  10. BUCKET_NAME = '<your_bucket_name>';
  11. }

賬號驗證

賬號驗證的邏輯很是簡單,就是將請求中包含的用戶信息與數據庫表中的信息進行比對,所以不須要涉及 SDK 的功能。

  1. <?php
  2. require_once 'db.php';
  3.  
  4. session_start();
  5.  
  6. if(!isset($_POST['uname']) && !isset($_POST['pwd']))
  7. {
  8. http_response_code( 401);
  9. $resp = array('status' => 'failed', 'msg' => 'please input username & password!');
  10. echo json_encode($resp);
  11. return;
  12. }
  13.  
  14. $uname = $_POST[ 'uname'];
  15. $_pwd = $_POST[ 'pwd'];
  16.  
  17. $salt = 'Qiniu' . $uname;
  18. $pwd = crypt($_pwd, $salt);
  19.  
  20. $stmt = $DB->prepare( 'select * from users where uname = :name');
  21. $stmt->execute( array('name' => $uname));
  22.  
  23. $user = $stmt->fetch();
  24.  
  25. if ($user['password'] !== $pwd)
  26. {
  27. http_response_code( 401);
  28. $resp = array('status' => 'failed', 'msg' => 'incorrect username or password!');
  29. echo json_encode($resp);
  30. return;
  31. }
  32.  
  33. $_SESSION[ 'uid'] = $user['uid'];
  34. $_SESSION[ 'uname'] = $uname;
  35.  
  36. $resp = array('status' => 'ok', 'uname' => $uname);
  37. echo json_encode($resp);

獲取文件列表

同賬號驗證功能同樣,獲取文件列表也只是查詢數據庫,所以很少作解釋。

  1. <?php
  2. require_once 'db.php';
  3.  
  4. session_start();
  5.  
  6. $uid = $_SESSION[ 'uid'];
  7. if(!isset($uid))
  8. {
  9. header( 'location: login.php');
  10. return;
  11. }
  12.  
  13. $stmt = $DB->prepare( 'select * from files_info where uid = :uid');
  14. $stmt->execute( array('uid' => $uid));
  15.  
  16. $files = $stmt->fetchAll();
  17.  
  18. echo json_encode($files);

獲取上傳受權

客戶端在須要上傳文件時都須要先向業務服務器發起一個獲取上傳受權的請求。 SDK 中的 Qiniu\Auth 類提供了 uploadToken($bucket, ...) 方法,能夠很是便利的生成對應的上傳受權。

  1. <?php
  2. require_once 'vendor/autoload.php';
  3. require_once 'db.php';
  4. require_once 'config.php';
  5.  
  6. use Qiniu\Auth;
  7.  
  8. session_start();
  9. $uid = $_SESSION[ 'uid'];
  10. if(!isset($uid))
  11. {
  12. header( 'location: login.php');
  13. return;
  14. }
  15.  
  16. $bucket = Config::BUCKET_NAME;
  17. $accessKey = Config::ACCESS_KEY;
  18. $secretKey = Config::SECRET_KEY;
  19. $auth = new Auth($accessKey, $secretKey);
  20.  
  21. $policy = array(
  22. 'callbackUrl' => 'http://172.30.251.210/callback.php',
  23. 'callbackBody' => '{"fname":"$(fname)", "fkey":"$(key)", "desc":"$(x:desc)", "uid":' . $uid . '}'
  24. );
  25.  
  26. $upToken = $auth->uploadToken($bucket, null, 3600, $policy);
  27.  
  28. header( 'Access-Control-Allow-Origin:*');
  29. echo $upToken;

回調

在收到回調時,一般表示一個文件已經成功上傳。回調會包含該文件所對應的描述信息。所以業務服務器在收到回調後,須要將相應的文件信息寫入到文件信息表中。

  1. <?php
  2. require_once 'db.php';
  3.  
  4. $_body = file_get_contents( 'php://input');
  5. $body = json_decode($_body, true);
  6.  
  7. $uid = $body[ 'uid'];
  8. $fname = $body[ 'fname'];
  9. $fkey = $body[ 'fkey'];
  10. $desc = $body[ 'desc'];
  11.  
  12. $date = new DateTime();
  13. $ctime = $date->getTimestamp();
  14.  
  15. $stmt = $DB->prepare( 'INSERT INTO files_info (uid, fname, fkey, createTime, description) VALUES (:uid, :fname, :fkey, :ctime, :desc);');
  16. $ok = $stmt->execute( array('uid' => $uid, 'fname' => $fname, 'fkey' => $fkey, 'ctime' => $ctime, 'desc' => $desc));
  17.  
  18. header( 'Content-Type: application/json');
  19. if (!$ok)
  20. {
  21. $resp = $DB->errorInfo();
  22. http_response_code( 500);
  23. echo json_encode($resp);
  24. return;
  25. }
  26.  
  27. $resp = array('ret' => 'success');
  28. echo json_encode($resp);

服務監控

爲了確認服務的正常運行,咱們還實現了一個簡單的監控頁面以查看全部上傳的圖片。該頁面假設admin的管理員纔有權訪問。後端代碼就是將用戶上傳的文件從數據庫中列取出來。

  1. <?php
  2. require_once 'vendor/autoload.php';
  3. require_once 'db.php';
  4.  
  5. if (!$_SESSION['logged'])
  6. {
  7. header( 'login.php');
  8. }
  9.  
  10. $id = $_POST[ 'id'];
  11. if ($id)
  12. {
  13. $stmt = $DB->prepare( 'delete from files_info where id = :id');
  14. $stmt->execute( array('id' => $id));
  15. }
  16.  
  17. $stmt = $DB->prepare( 'select * from files_info');
  18. $stmt->execute();
  19. $files = $stmt->fetchAll();
  20.  
  21. $smarty = new Smarty();
  22. $smarty->assign( 'files', $files);
  23.  
  24. $smarty->display( 'file_mgr.tpl');

前端頁面使用 Bootstrap 的控件實現,並使用 Smarty 模板技術來循環生成最終頁面:

  1. {foreach from=$files item=file}
  2. <tr>
  3. <td><a href="{$file[uid]}">{$file["uid"]}</a></td>
  4. <td>{$file["fname"]}</td>
  5. <td>{$file["fkey"]}</td>
  6. <td>{$file["description"]}</td>
  7. <td>{$file["createTime"]}</td>
  8. <td><a class="del" href="" data-fid="{$file['id']}">刪除</a></td>
  9. </tr>
  10. {/foreach}

移動端實現

本示例包含一個 Android 客戶端的實現。由於本文檔的重心是結合例子講解 PHP SDK 的使用,所以這裏就不詳細講解如何實現 Android 客戶端了。您能夠下載和安裝移動客戶端的安裝包,或查看移動客戶端的源代碼

小結

您能夠在 Android 手機或者模擬器上安裝和運行本示例的移動端應用,上傳一張圖片,並查看圖片列表和描述。這個示例的重點在於講解一個推薦的產品架構,以及各個子系統如何協同工做。

接下來咱們再圍繞幾個示例遍歷七牛雲提供的其餘強大功能。接下來的示例都不會再像這個示例同樣提供一個完整的移動互聯網產品架構,而是把重點放在功能介紹上。您能夠觸類旁通,快速的在本章介紹的示例上進行修改和增強,就能夠快速開發出各類有趣的移動互聯網應用。移動端安裝包,或查看移動客戶端的源代碼admin管理界面

 

圖片處理

咱們將圍繞一個功能相對完備的示例來說解圖片處理的主要用法,並順便介紹 PHP SDK 的資源管理功能。

這個示例用戶能夠上傳圖片,選擇圖片處理模式,輸入相應的處理參數,而後能夠查看處理的結果。用戶還能夠點選不一樣的圖片以顯示圖片的鑑黃信息和鑑別廣告的信息, 以及獲取圖片的基本信息,平均色,exif信息等。

下面咱們分步來實現這個示例。前端實現使用了Bootstrap和咱們的js-sdk,後端使用 phpsdk 生成上傳的 token 。

生成上傳token

首先安裝咱們的 phpsdk,而後引入相應文件並調用接口生成上傳token:

  1. require_once 'vendor/autoload.php';
  2. require_once 'config.php';
  3.  
  4. use Qiniu\Auth;
  5.  
  6. $bucket = Config::BUCKET_NAME;
  7. $accessKey = Config::ACCESS_KEY;
  8. $secretKey = Config::SECRET_KEY;
  9.  
  10. $auth = new Auth($accessKey, $secretKey);
  11. $upToken = $auth->uploadToken($bucket);
  12.  
  13. $ret = array('uptoken' => $upToken);
  14.  
  15. echo json_encode($ret);

上傳部分相關的 html 代碼:

  1. <div id="container">
  2. <button id="pickfiles" class="btn btn-primary btn-lg btn-block" type="submit">上傳圖片</button>
  3. </div>

上傳對應的調用 jssdk 相關代碼:

  1. var uploader = Qiniu.uploader({
  2. runtimes: 'html5,flash,html4', //上傳模式,依次退化
  3. browse_button: 'pickfiles', //上傳選擇的點選按鈕,**必需**
  4. uptoken_url: 'uptoken.php', //Ajax請求upToken的Url,**強烈建議設置**(服務端提供)
  5. domain: 'http://rwxf.qiniudn.com/', //bucket 域名,下載資源時用到,**必需**
  6. container: 'container', //上傳區域DOM ID,默認是browser_button的父元素,
  7. max_file_size: '100mb', //最大文件體積限制
  8. flash_swf_url: 'plupload/Moxie.swf', //引入flash,相對路徑
  9. max_retries: 3, //上傳失敗最大重試次數
  10. dragdrop: true, //開啓可拖曳上傳
  11. drop_element: 'container', //拖曳上傳區域元素的ID,拖曳文件或文件夾後可觸發上傳
  12. chunk_size: '4mb', //分塊上傳時,每片的體積
  13. auto_start: true, //選擇文件後自動上傳,若關閉須要本身綁定事件觸發上傳
  14. init: {
  15. 'UploadProgress': function(up, file) {
  16. $( '#pickfiles').prop('disabled', true).html('圖片上傳中...');
  17. },
  18. 'FileUploaded': function(up, file, info) {
  19.  
  20. $( '#pickfiles').prop('disabled', false).html('上傳圖片');
  21. var res = JSON.parse(info);
  22. imgUrl = up.getOption( 'domain') + res.key;
  23. refresh(imgUrl);
  24. },
  25. 'Error': function(up, err, errTip) {
  26. $( '#pickfiles').prop('disabled', false).html('上傳圖片');
  27. }
  28. }
  29. });

圖片處理

圖片處理的過程很是簡單,就是將咱們的圖片處理 fop 以及對應的參數拼接在圖片地址後面便可。基本不須要用到 SDK 的功能,固然你也可使用咱們的 jssdk 進行圖片地址和處理參數的拼接。 好比一個圖片:http://qiniuphotos.qiniudn.com/gogopher.jpg,如今咱們對這個圖片進行200x200的等比縮放,而後再進行居中剪裁,可使用imageView2的模式1,最終獲得的圖片:http://qiniuphotos.qiniudn.com/gogopher.jpg?imageView2/1/w/200/h/200

更多處理規格請參考圖片基本處理 (imageView2)文檔。

圖片信息

  1. {
  2. format: "jpeg",
  3. width: 640,
  4. height: 427,
  5. colorModel: "ycbcr",
  6. orientation: "Top-left"
  7. }
  1. {
  2. RGB: "0x85694d"
  3. }
  1. {
  2. ApertureValue: {
  3. val: "5.00 EV (f/5.7)",
  4. type: 5
  5. },
  6. ColorSpace: {
  7. val: "sRGB",
  8. type: 3
  9. },
  10. ComponentsConfiguration: {
  11. val: "- - - -",
  12. type: 7
  13. },
  14. ...
  15. }

自定義數據處理功能

除了咱們官方提供的強大圖片處理功能外,咱們的自定義數據處理平臺還提供了強大的第三方數據處理服務。在本例中咱們就來嘗試一下圖片鑑黃服務(nrop)

要使用 NROP 功能,用戶須要先在管理平臺上的第三方數據處理開啓本功能。開啓後使用方式與通常的數據處理指令徹底一致(好比獲取 EXIF 信息的接口),僅須要使用帶 nrop 參數的 GET 請求便可,返回的 HTTP 響應內容爲一個包含鑑定結果的 JSON 字符串。示例代碼以下:

http://qiniuphotos.qiniudn.com/gogopher.jpg?nrop

  1. {
  2. statistic: [
  3. 0,
  4. 0,
  5. 1
  6. ],
  7. reviewCount: 0,
  8. fileList: [{
  9. rate: 0.9946920275688171, // 介於0-1間的浮點數,表示該圖像被識別爲某個分類的機率值,機率越高、機器越確定
  10. label: 2, // 0:色情; 1:性感; 2:正常
  11. name: "739a77baf4ff2d5eae5fe56602fc0cbe/gogopher.jpg",
  12. review: false //是否須要人工複審該圖片,鑑黃服務是否對結果肯定(true:不肯定,false:肯定)
  13. }],
  14. nonce: "0.5508577267173678",
  15. timestamp: 1437903830,
  16. code: 0,
  17. message: "success"
  18. }

咱們提供的完整示例已經包含了對 NROP 的調用,以及對廣告的鑑定,您能夠體驗一下效果。

小結

這個示例結束後,相信你已經比較瞭解咱們的平臺是如何支持圖片內容的編輯,基本上這些動做都只是一個簡單的 GET 請求便可完成,甚至都不須要依賴於 SDK。您能夠查看本示例的在線演示,或查看和下載本示例的完整源代碼

 

音視頻處理

用一個示例詳細講解七牛雲對音視頻和流媒體格式的強大支持。該示例的目標爲完成如下動做:

  1. 支持斷點續傳的大文件上傳,由於視頻文件一般比較大,難以用單次 POST 請求完成上傳;
  2. 支持上傳後異步執行的自動轉碼動做,生成若干不一樣規格的目標視頻,分別適合在手機和電腦上播放;
  3. 將文件轉換爲 HLS 格式存放,以支持邊下載邊播放的效果;
  4. 爲視頻打上一個圖片水印;
  5. 統一從每個視頻文件抽取一個固定時間點的畫面做爲預覽圖片;
  6. 在網頁播放器中播放生成的視頻文件;

咱們選用 plupload 做爲咱們的上傳控件,並使用 videojs 做爲咱們的網頁播放器。其餘採用的技術與以前的示例一致,主要是 Bootstrap 和 Smarty 。由於文件爲客戶端直傳,所以咱們也須要提供一個回調服務,以便於接收上傳和轉碼這些異步任務的完成事件。爲了簡單起見,該示例就再也不實現一個獨立的業務數據庫了,直接從目標存儲空間獲取文件信息。

大文件上傳

由於大文件上傳必須在瀏覽器端進行,所以咱們就不演示如何用 PHP SDK 作斷點續上傳了。網頁端的大文件上傳咱們能夠用定製版本的 plupload 來支持。 具體能夠查看咱們的jssdk

上傳後自動轉碼

咱們能夠經過設置上傳策略來通知雲存儲服務在上傳完成後自動發起一個異步的任務。上傳策略在調用上傳接口時做爲參數傳入。 這裏的轉碼過程須要支持轉爲 HLS 格式,而且在轉碼後打上視頻水印。具體生成上傳策略的代碼爲:

  1. $bucket = Config::BUCKET_NAME;
  2. $auth = new Auth(Config::AK, Config::SK);
  3.  
  4. $wmImg = Qiniu\base64_urlSafeEncode( 'http://rwxf.qiniudn.com/logo-s.png');
  5. $pfopOps = "avthumb/m3u8/noDomain/1/wmImage/$wmImg";
  6. $policy = array(
  7. 'persistentOps' => $pfopOps,
  8. 'persistentNotifyUrl' => 'http://<your_notify_url>',
  9. );
  10.  
  11. $upToken = $auth->uploadToken($bucket, null, 3600, $policy);
  12.  
  13. echo json_encode(array('uptoken' => $upToken));

抽取視頻截圖

咱們能夠從上傳視頻中截取固定時間點的幀,以做爲這些視頻的封面圖片。視頻截圖以下所示:

  1. http://<your_uploaded_video>?vframe/jpg/offset/5

視頻瀏覽與播放

在完成以上工做後,接下來的工做就簡單了。咱們能夠生成一個列表網頁,每一個列表項都是一張視頻截圖,點擊視頻截圖會彈出一個播放面板。由於相似的前端代碼已經在本文檔展現過,這裏就再也不多展現一次。

小結

視頻的示例就到這裏完成了。您能夠直接查看本示例的在線演示,或下載和查看本示例的完整源代碼

須要注意的是,咱們這邊使用了videojs的開源播放器, 世面上還有其餘比較優秀的播放器,具體你能夠參考播放器推薦

另外,對於視頻內容,CDN 的選擇會是一個影響視頻播放是否可以足夠流暢的關鍵因素。在融合 CDN 管理平臺會給列出的可用 CDN 線路標註是否適用於視頻加速,請合理選擇。

 

文件上傳

 

上傳流程

爲了儘量地改善終端用戶的上傳體驗,七牛雲存儲獨創了客戶端直傳功能。更多信息請參閱業務流程

上傳代碼:

  1. <?php
  2. require_once 'path_to_sdk/vendor/autoload.php';
  3.  
  4. // 引入鑑權類
  5. use Qiniu\Auth;
  6.  
  7. // 引入上傳類
  8. use Qiniu\Storage\UploadManager;
  9.  
  10. // 須要填寫你的 Access Key 和 Secret Key
  11. $accessKey = 'Access_Key';
  12. $secretKey = 'Secret_Key';
  13.  
  14. // 構建鑑權對象
  15. $auth = new Auth($accessKey, $secretKey);
  16.  
  17. // 要上傳的空間
  18. $bucket = 'Bucket_Name';
  19.  
  20. // 生成上傳 Token
  21. $token = $auth->uploadToken($bucket);
  22.  
  23. // 要上傳文件的本地路徑
  24. $filePath = './php-logo.png';
  25.  
  26. // 上傳到七牛後保存的文件名
  27. $key = 'my-php-logo.png';
  28.  
  29. // 初始化 UploadManager 對象並進行文件的上傳
  30. $uploadMgr = new UploadManager();
  31.  
  32. // 調用 UploadManager 的 putFile 方法進行文件的上傳
  33. list($ret, $err) = $uploadMgr->putFile($token, $key, $filePath);
  34. echo "\n====> putFile result: \n";
  35. if ($err !== null) {
  36. var_dump($err);
  37. } else {
  38. var_dump($ret);
  39. }

 

上傳&回調

  1. <?php
  2. require_once 'path_to_sdk/vendor/autoload.php';
  3.  
  4. use Qiniu\Auth;
  5. use Qiniu\Storage\UploadManager;
  6.  
  7. $accessKey = 'Access_Key';
  8. $secretKey = 'Secret_Key';
  9. $auth = new Auth($accessKey, $secretKey);
  10.  
  11. $bucket = 'Bucket_Name';
  12. // 上傳文件到七牛後, 七牛將文件名和文件大小回調給業務服務器
  13.  
  14. $policy = array(
  15. 'callbackUrl' => 'http://your.domain.com/callback.php',
  16. 'callbackBody' => 'filename=$(fname)&filesize=$(fsize)'
  17. );
  18. $uptoken = $auth->uploadToken($bucket, null, 3600, $policy);
  19.  
  20. //上傳文件的本地路徑
  21. $filePath = './php-logo.png';
  22.  
  23. $uploadMgr = new UploadManager();
  24.  
  25. list($ret, $err) = $uploadMgr->putFile($uptoken, null, $filePath);
  26. echo "\n====> putFile result: \n";
  27. if ($err !== null) {
  28. var_dump($err);
  29. } else {
  30. var_dump($ret);
  31. }

 

上傳&預轉持續化

以視頻轉碼爲例:

  1. <?php
  2. require_once 'path_to_sdk/vendor/autoload.php';
  3.  
  4. use Qiniu\Auth;
  5. use Qiniu\Storage\UploadManager;
  6.  
  7. $accessKey = 'Access_Key';
  8. $secretKey = 'Secret_Key';
  9. $auth = new Auth($accessKey, $secretKey);
  10.  
  11. $bucket = 'Bucket_Name';
  12.  
  13. //轉碼時使用的隊列名稱
  14. $pipeline = 'abc';
  15.  
  16. //要進行轉碼的轉碼操做
  17. $fops = "avthumb/mp4/s/640x360/vb/1.25m";
  18.  
  19. //能夠對轉碼後的文件進行使用saveas參數自定義命名,固然也能夠不指定文件會默認命名並保存在當間
  20. $savekey = Qiniu\base64_urlSafeEncode( '目標Bucket_Name:自定義文件key');
  21. $fops = $fops. '|saveas/'.$savekey;
  22.  
  23. $policy = array(
  24. 'persistentOps' => $fops,
  25. 'persistentPipeline' => $pipeline
  26. );
  27. $uptoken = $auth->uploadToken($bucket, null, 3600, $policy);
  28.  
  29. //上傳文件的本地路徑
  30. $filePath = './php-logo.png';
  31.  
  32. $uploadMgr = new UploadManager();
  33.  
  34. list($ret, $err) = $uploadMgr->putFile($uptoken, null, $filePath);
  35. echo "\n====> putFile result: \n";
  36. if ($err !== null) {
  37. var_dump($err);
  38. } else {
  39. var_dump($ret);
  40. }

隊列 (pipeline) 請參閱[建立私有隊列][mpsHref];轉碼操做具體參數請參閱音視頻轉碼;saveas 請參閱處理結果另存

Tips:上面的 Demo 只是針對視頻轉碼功能,若是您須要使用好比音視頻切片、視頻截圖、視頻拼接等功能只須要修改上面 fops 後面的參數便可,如:$fops = vframe/jpg/offset/1/w/480/h/360/rotate/90 就表示視頻截圖了。

能夠看到上傳成功後的行爲主要是由上傳憑證中的上傳策略來指定。其中 上傳策略能夠指定的行爲不止這些,具體請參閱上傳策略。等文件上傳成功後就會向你設置的 callbackUrl 發起回調,你的服務器要接受並處理這個回調信息,並返回合法json數據到七牛服務器,七牛將接收到的 json 數據返回給客戶端。下面咱們給一個例子來看怎麼接收回調信息,並驗證該回調是否來自七牛:

  1. <?php
  2. require_once 'path_to_sdk/vendor/autoload.php';
  3.  
  4. use Qiniu\Auth;
  5.  
  6. $accessKey = 'Access_Key';
  7. $secretKey = 'Secret_Key';
  8. $auth = new Auth($accessKey, $secretKey);
  9.  
  10. //獲取回調的body信息
  11. $callbackBody = file_get_contents( 'php://input');
  12.  
  13. //回調的contentType
  14. $contentType = 'application/x-www-form-urlencoded';
  15.  
  16. //回調的簽名信息,能夠驗證該回調是否來自七牛
  17. $authorization = $_SERVER[ 'HTTP_AUTHORIZATION'];
  18.  
  19. //七牛回調的url,具體能夠參考
  20. $url = 'http://your.domain.com/callback.php';
  21.  
  22. $isQiniuCallback = $auth->verifyCallback($contentType, $authorization, $url, $callbackBody);
  23.  
  24. if ($isQiniuCallback) {
  25. $resp = array('ret' => 'success');
  26. } else {
  27. $resp = array('ret' => 'failed');
  28. }
  29.  
  30. echo json_encode($resp);

 

文件下載

  1. <?php
  2. require 'path_to_sdk/vendor/autoload.php';
  3.  
  4. // 引入鑑權類
  5. use Qiniu\Auth;
  6.  
  7. // 須要填寫你的 Access Key 和 Secret Key
  8. $accessKey = 'Access_Key';
  9. $secretKey = 'Secret_Key';
  10.  
  11. // 構建鑑權對象
  12. $auth = new Auth($accessKey, $secretKey);
  13.  
  14. //baseUrl構形成私有空間的域名/key的形式
  15. $baseUrl = 'http://domain/key';
  16. $authUrl = $auth->privateDownloadUrl($baseUrl);
  17. echo $authUrl;
  18. ?>

 

空間資源管理

 

獲取文件信息

  1. <?php
  2. require_once 'path_to_sdk/vendor/autoload.php';
  3.  
  4. use Qiniu\Auth;
  5. use Qiniu\Storage\BucketManager;
  6.  
  7. $accessKey = 'Access_Key';
  8. $secretKey = 'Secret_Key';
  9.  
  10. //初始化Auth狀態
  11. $auth = new Auth($accessKey, $secretKey);
  12.  
  13. //初始化BucketManager
  14. $bucketMgr = new BucketManager($auth);
  15.  
  16. //你要測試的空間, 而且這個key在你空間中存在
  17. $bucket = 'Bucket_Name';
  18. $key = 'php-logo.png';
  19.  
  20. //獲取文件的狀態信息
  21. list($ret, $err) = $bucketMgr->stat($bucket, $key);
  22. echo "\n====> $key stat : \n";
  23. if ($err !== null) {
  24. var_dump($err);
  25. } else {
  26. var_dump($ret);
  27. }

 

移動單個文件

  1. <?php
  2. require_once 'path_to_sdk/vendor/autoload.php';
  3.  
  4. use Qiniu\Auth;
  5. use Qiniu\Storage\BucketManager;
  6.  
  7. $accessKey = 'Access_Key';
  8. $secretKey = 'Secret_Key';
  9.  
  10. //初始化Auth狀態
  11. $auth = new Auth($accessKey, $secretKey);
  12.  
  13. //初始化BucketManager
  14. $bucketMgr = new BucketManager($auth);
  15.  
  16. //你要測試的空間, 而且這個key在你空間中存在
  17. $bucket = 'Bucket_Name';
  18. $key = 'php-logo.png';
  19.  
  20. //將文件從文件$key移動到文件$key2。能夠在不一樣bucket移動
  21. $key2 = 'php-logo2.png';
  22. $err = $bucketMgr->move($bucket, $key, $bucket, $key2);
  23. echo "\n====> move $key to $key2 : \n";
  24. if ($err !== null) {
  25. var_dump($err);
  26. } else {
  27. echo "Success!";
  28. }

 

複製單個文件

  1. <?php
  2. require_once 'path_to_sdk/vendor/autoload.php';
  3.  
  4. use Qiniu\Auth;
  5. use Qiniu\Storage\BucketManager;
  6.  
  7. $accessKey = 'Access_Key';
  8. $secretKey = 'Secret_Key';
  9.  
  10. //初始化Auth狀態
  11. $auth = new Auth($accessKey, $secretKey);
  12.  
  13. //初始化BucketManager
  14. $bucketMgr = new BucketManager($auth);
  15.  
  16. //你要測試的空間, 而且這個key在你空間中存在
  17. $bucket = 'Bucket_Name';
  18. $key = 'php-logo.png';
  19.  
  20. //將文件從文件$key複製到文件$key2。能夠在不一樣bucket複製
  21. $key2 = 'php-logo2.png';
  22. $err = $bucketMgr->copy($bucket, $key, $bucket, $key2);
  23. echo "\n====> copy $key to $key2 : \n";
  24. if ($err !== null) {
  25. var_dump($err);
  26. } else {
  27. echo "Success!";
  28. }

 

刪除單個文件

  1. <?php
  2. require_once 'path_to_sdk/vendor/autoload.php';
  3.  
  4. use Qiniu\Auth;
  5. use Qiniu\Storage\BucketManager;
  6.  
  7. $accessKey = 'Access_Key';
  8. $secretKey = 'Secret_Key';
  9.  
  10. //初始化Auth狀態
  11. $auth = new Auth($accessKey, $secretKey);
  12.  
  13. //初始化BucketManager
  14. $bucketMgr = new BucketManager($auth);
  15.  
  16. //你要測試的空間, 而且這個key在你空間中存在
  17. $bucket = 'Bucket_Name';
  18. $key = 'php-logo.png';
  19.  
  20. //刪除$bucket 中的文件 $key
  21. $err = $bucketMgr->delete($bucket, $key);
  22. echo "\n====> delete $key : \n";
  23. if ($err !== null) {
  24. var_dump($err);
  25. } else {
  26. echo "Success!";
  27. }

 

列舉空間中文件

  1. <?php
  2. require_once __DIR__ . '/../autoload.php';
  3.  
  4. use Qiniu\Auth;
  5. use Qiniu\Storage\BucketManager;
  6.  
  7. $accessKey = 'Access_Key';
  8. $secretKey = 'Secret_Key';
  9. $auth = new Auth($accessKey, $secretKey);
  10. $bucketMgr = new BucketManager($auth);
  11.  
  12. // 要列取的空間名稱
  13. $bucket = 'Bucket_Name';
  14.  
  15. // 要列取文件的公共前綴
  16. $prefix = '';
  17.  
  18. $marker = '';
  19. $limit = 3;
  20.  
  21. list($iterms, $marker, $err) = $bucketMgr->listFiles($bucket, $prefix, $marker, $limit);
  22. if ($err !== null) {
  23. echo "\n====> list file err: \n";
  24. var_dump($err);
  25. } else {
  26. echo "Marker: $marker\n";
  27. echo "\nList Iterms====>\n";
  28. var_dump($iterms);
  29. }

 

觸發持久化操做

以視頻轉碼爲例:

  1. <?php
  2. require_once 'path_to_sdk/vendor/autoload.php';
  3.  
  4. use Qiniu\Auth;
  5. use Qiniu\Processing\PersistentFop;
  6.  
  7. //對已經上傳到七牛的視頻發起異步轉碼操做
  8.  
  9. $accessKey = 'Access_Key';
  10. $secretKey = 'Secret_Key';
  11. $auth = new Auth($accessKey, $secretKey);
  12.  
  13. //要轉碼的文件所在的空間和文件名
  14. $bucket = 'Bucket_Name';
  15. $key = '1.mp4';
  16.  
  17. //轉碼是使用的隊列名稱
  18. $pipeline = 'abc';
  19. $pfop = new PersistentFop($auth, $bucket, $pipeline);
  20.  
  21. //要進行轉碼的轉碼操做
  22. $fops = "avthumb/mp4/s/640x360/vb/1.25m";
  23.  
  24. list($id, $err) = $pfop->execute($key, $fops);
  25. echo "\n====> pfop avthumb result: \n";
  26. if ($err != null) {
  27. var_dump($err);
  28. } else {
  29. echo "PersistentFop Id: $id\n";
  30. }
  31.  
  32. //查詢轉碼的進度和狀態
  33. list($ret, $err) = $pfop->status($id);
  34. echo "\n====> pfop avthumb status: \n";
  35. if ($err != null) {
  36. var_dump($err);
  37. } else {
  38. var_dump($ret);
  39. }

Tips:上面的Demo只是針對視頻轉碼功能,若是您須要使用好比音視頻切片、視頻截圖、視頻拼接等功能只須要修改上面 fops 後面的參數便可,如:$fops = vframe/jpg/offset/1/w/480/h/360/rotate/90 就表示視頻截圖了。

經過上面的代碼咱們就能夠觸發將存儲在空間中的視頻從 mp4 格式轉換成 m3u8 格式,並設置分辨率和視頻碼率。 但這個只是將轉碼這個耗時的操做提交到隊列中,要想知道轉碼操做如今的狀態,須要根據返回的 persitentId 進行查詢。

  1. <?php
  2. require_once 'path_to_sdk/vendor/autoload.php';
  3.  
  4. use Qiniu\Processing\PersistentFop;
  5.  
  6. // 觸發持久化處理後返回的 Id
  7. $persistentId = 'z0.564d5f977823de48a85ece59';
  8.  
  9. // 經過persistentId查詢該 觸發持久化處理的狀態
  10. $status = PersistentFop::status($persistentId);
  11.  
  12. var_dump($status);

若是您不方便持續輪詢每一個異步處理的進度和狀態,七牛能夠異步處理完成後通知您們的業務服務器。 這樣就須要您在視頻轉碼的例子中,初始化 PersistentFop 時添加上 notifyUrl 來通知您們的業務服務器:

  1. //你業務服務器的地址
  2. $notifyUrl = 'http://your.bizhost.com/notify.php';
  3. $pfop = new PersistentFop($auth, $bucket, $pipeline, $notifyUrl);

您的業務服務器須要接收來自七牛的通知:

  1. <?php
  2.  
  3. // 獲取notify通知的body信息
  4. $notifyBody = file_get_contents( 'php://input');
  5.  
  6. // 業務服務器處理通知信息, 這裏直接打印在log中
  7. error_log($notifyBody);

咱們以視頻轉碼爲例子,完整介紹了觸發持久化的整個流程。觸發持久化本質上是:使用異步隊列的方式來處理已上傳到七牛的數據資源並將處理的結果持久化到七牛。雖然可使用觸發持久化的方式處理七牛全部的數據處理,可是圖片處理等能夠同步處理的,建議使用同步處理。關於音視頻處理,好比音視頻轉碼音視頻切片音視頻拼接等較耗時的操做必須使用觸發持久化方式,或者在上傳憑證中指定處理參數的預轉持久化操做。

 

API參考手冊

 

常見問題

相關文章
相關標籤/搜索