程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> 使用PHP訪問Dropbox

使用PHP訪問Dropbox

編輯:關於PHP編程

在這篇文章中,我們將探討在Dropbox帳戶訪問文件通過構建一個簡單的客戶端的Dropbox API。客戶端將執行一些基本操作,如認證,上市文件,上傳和下載文件。
保持短期性和可讀性的文章,我會保持代碼到最低限度,而不是指你上PHPMaster的GitHub上提供完整的代碼。要運行的代碼,你需要與卷曲的支持,顯然是一個PHP Dropbox帳戶。
您的出發點應該是任何有關發展與Dropbox Dropbox的開發中心,在那裡你可以找到它的基本概念和最佳實踐的API參考。你也可以下載官方的SDK,但PHP不支持的語言中列出。還有一個鏈接到第三方的PHP SDK的 GitHub上。
我們的客戶將結構更像是Python官方客戶端,但我注意到,尤其是對OAuth的一部分,從以上的PHP SDK的一些想法和代碼,。我們將有一個DropboxSession對象和DropboxClient的對象。首先照顧最困難的部分:從Dropbox的獲取和管理訪問憑據。客戶端對象,然後將使用會話對象執行API調用和獲取數據。下面的會話對象是DropboxRESTClient對象來執行HTTP調用使用cURL。
告訴Dropbox的關於您的應用程序
首先,我們需要注冊我們的應用程序,以獲得一個獨特的API密鑰對與Dropbox。我們需要這些鍵“引進”我們的應用程序和要求進行授權。
登錄到開發中心,並遵循“MyApps”鏈接,然後選擇“創建一個應用程序”。Dropbox的會問你的名稱,描述,為您的應用程序和訪問類型。

訪問類型參數指定您的應用程序將能夠讀取和寫入文件。建議值是“應用程序文件夾”,目錄內用戶的家中,將創建一個沙盤。選擇“全Dropbox的”應用程序將用戶的整個Dropbox的。
一旦你的應用程序創建的,會有一個選項頁,在這裡你可以編輯其詳細信息,並找到其訪問憑據。


新創建的應用是在“發展狀態”。這讓我們立即開始開發,並允許多達5個其他用戶對其進行測試。應用程序是准備發布時,我們可以申請生產狀況和Dropbox的團隊會檢討,以確保它符合其條款及條件和品牌指引。
編碼的應用程序
我把我的代碼在我的本地Apache的一個子目錄設置,以便它是在URL訪問http://localhost/mydropbox。目錄結構是:


bootstrap.php文件,執行應用程序的啟動,將在每個前端文件,所以讓我們開始討論,。
我初始化一個全局配置為一個空數組變量,然後指定一些配置值。前三Dropbox的相關訪問密鑰,密鑰,並從您的應用程序的詳細信息頁面的訪問類型。然後,我定義其他一些有用的設置:應用程序的基根的路徑,保存一些數據,和一個PHP文件的路徑,將包含應用程序的訪問令牌。
這個訪問令牌文件的文件中不存在的開始;它創建由authorize.php頁和充滿Dropbox的所提供的憑據。這將是一個標准的PHP文件,如果存在,將被納入這個腳本後。令牌文件的內容將類似於:
<?php
$access_token = array (
  "oauth_token_secret" => "abcdefghilmnopqr",
  "oauth_token" => "stuvwxyzabcdefgh",
  "uid" => "1234567"
);
oauth_token和oauth_token_secret訪問憑據,UID是用戶的唯一ID。
我在下一節的引導文件設置PHP的錯誤行為,並執行一些要求檢查;為了運行應用程序的數據目錄必須存在和可寫的auth.php文件必須是可寫的,如果它存在。這將確保應用程序可以自由地完成其工作。
最後,我包括我們的圖書館,PHP會話初始化,設置一個空美元access_token(稍後將填寫),而且,如果它存在,包括auth.php文件。
每個前端腳本將運行裡面一個主要的嘗試 / 捕捉塊。挖庫代碼之前,我們首先需要理解的流量,所以我將開始與授權周期。
授權
 
第一次運行我們的應用程序,在下列條件下的index.php文件將是真實的:
1  <?php
2  if (!isset($access_token)) {
3      header("Location: authorize.php");
4      exit;
5  }
訪問令牌是空的,所以我將用戶重定向到的authorize.php頁,會管理的授權過程。
引導階段後,我做的另一個現有令牌檢查。這將確保這個腳本運行,只有當我們沒有一個令牌。為了避免無限重定向循環中,auth.php文件被刪除腳本塊的主要漁獲,如果返回的錯誤代碼是401(無效的令牌)。
我在每一個腳本做的第一件事是創建一個新的DropboxSession與我們的API密鑰的對象。當我們直接調用腳本,首要條件是假的,其他塊被執行。會話對象連接到Dropbox和要求一個臨時令牌。令牌,然後解析成一個數組存儲到變量$ _SESSION中的下一階段。
我們建立授權使用此令牌的URL。用戶應重定向或提示訪問的網址,在那裡他將決定是否允許或拒絕對他的數據的訪問。
授權URL可以包含一個可選的參數,返回URL。我只是通過當前腳本的URL,因此如果用戶授權他重定向到我們的腳本的應用程序,這個用的時間的oauth_token和UID查詢字符串傳遞的值。現在的首要條件評估真實的,所以我們可以去,並要求一個永久的訪問令牌。
美元令牌這一要求的陣列是這個新建成oauth_token與以往oauth_token_secret的,這是然後傳遞到的obtainAccessToken()方法。在成功的情況下,我們有我們的永久(直至撤銷)訪問令牌。這必須存儲在某個地方,顯而易見的選擇是一個數據庫,但在這個例子中,我們將出口作為有效的PHP代碼使用本地var_export()函數和它寫入我們auth.php文件中。然後將用戶重定向到索引頁面,這是最簡單的腳本。
在我們開始嘗試 / 捕捉阻止一個新DropboxSession對象被創建,永久這次$ access_token作為第四個參數。此對象用於創建的DropboxClient對象。這兩個步驟是共同所有其他腳本。
客戶端的公共方法映射到相應的Dropbox的API調用。我打電話的AccountInfo()方法,返回一個數組,包含用戶的詳細資料:唯一的ID,姓名,電子郵件,配額信息和推介鏈接(指正式文件的更多細節)。
幕後:REST和會話對象
現在,我們有一個表面流的概述,讓我們看到引擎蓋下發生的事情,我們的Dropbox的庫包含在lib / Dropbox的目錄中,包括三類。
靜止的物體
 
最低水平一流,我們的圖書館是REST客戶端(見LIB /保管箱/ rest.php)。這個類是為卷曲簡單的包裝。它執行HTTP調用,並返回在原料或編碼格式的輸出,或在一個錯誤的情況下拋出異常。
構造檢查cURL是在系統上安裝,或者拋出一個異常。然後,它嘗試初始化內部卷曲與處理程序美元curlDefaults設置。析構函數裡面沒有設置該處理程序。
()的錯誤,並將errno() ,()方法是不言自明。然後,我們有一系列實用的方法,得到() ,後()和put()方法簡單的包裝,所有的主要要求()方法,它的實際工作。
首先,我們設置了URL獲取HTTP方法和所需的參數,額外的頭和POST(如有)。沿URL呼叫者方法為GET和PUT方法的參數傳遞。
在進行調用之前,我們需要告訴卷曲檢索的全部內容,包括HTTP頭(設置選項CURLOPT_HEADER),因為一些API的方法(當然file_get() )把他們的信息,在頭。
卷曲的請求被執行存儲到curl_exec()的結果為響應和元信息的變量是由的充滿curl_info()有關執行細節。如果提出的方法,我們也將不得不關閉輸入文件句柄。
元響應的內容和元信息,我們分析的結果,並從身體中分離出來的HTTP頭。默認情況下,身體返回的JSON解碼,除非美元的原始參數設置為true。
怎麼回事之前,有一個錯誤檢查。Dropbox的API使用HTTP錯誤代碼錯誤通知。如果狀態碼是大於400,則出現了錯誤和錯誤信息被儲存在體內的含量。我提取這個消息,並拋出一個異常。如果沒有錯誤的HTTP頭解析結果返回的數組包含狀態代碼,頭和身體。
Session對象
 
DropboxSession對象擴展的基本REST客戶端,以填補我們的需求:
執行初始認證/授權的流量,
包括在以後每次REST請求獲得驗證數據。
構造簡單initiazlizes內部變量。另一種簡單的方法是buildAuthorizeURL()建立的臨時令牌授權URL。類的最重要的方法是:
obtainRequestToken() -請求一個臨時的OAuth訪問令牌。
obtainAccessToken() -要求永久OAuth的應用程序的訪問令牌。
取() -執行其余打電話,包括所有必要的認證和簽名參數。
這三種方法也有類似的流動。首先,他們建立的基本目標URL和填寫的params美元,與所需的關聯數組oauth_ *鍵/值發送。每個API調用都必須提供一個時間戳和一個唯一的隨機生成的哈希,美元的nonce參數。
然後使用HTTP方法的名稱,URL,參數生成簽名。它然後排隊美元的params數組使用oauth_signature鍵。網址是牽強與給定的HTTP方法和返回響應的身體的一部分。對於GET和PUT方法,生成的查詢字符串附加到URL使用的的本地http_build_query()函數。
的obtainRequestToken和obtainAccessToken()幾乎是相同的:一是不使用令牌和一個GET HTTP方法調用。第二個被稱為一個POST HTTP方法必須包括與以前的調用獲得的令牌。此標記,然後用以下所有的API調用的簽名密鑰的一部分。
取()方法執行一些額外的任務。首先,它需要一個數組名為$ ARGS與特定的API所需的任何額外的參數,例如資源列表或上傳/下載文件的路徑。這些參數與美元的params數組合並之前生成簽名。唯一的例外是使用PUT方法上傳文件,輸入文件中的參數,提取和保存,為以後。一個開關語句被用來告訴正確的HTTP方法來調用。
的DropboxSession類兩個實用方法,encodeParams()和getSignature() ,在上述主要方法調用的encodeParams()准備請求的參數進行簽名,而getSignature()產生在給定的API調用1 OAuth的要求簽名。
最後DropboxClient對象
DropboxClient對象是我們的高級別接口與Dropbox。它暴露了公共API的方法,使用中期水平DropboxSession,對象執行API調用,並返回一個處理輸出調用腳本。在這篇文章中,我已經實現了一套有限的方法:
的AccountInfo() -獲取當前Dropbox的用戶的詳細信息。
元數據() -獲取關於Dropbox的對象(文件或文件夾)的信息和檢索文件夾對象的內容列表。
GETFILE() -下載文件和其元數據,並選擇性地將其保存到磁盤。
PUTFILE() -本地的文件上傳到遠程Dropbox的路徑。
會話對象和基本API的URL存儲為內部變量和構造函數初始化。
所有方法都遵循同樣的方法或多或少,所以我要指出的差異。所有路徑處理的方法,必須預先考慮到每個呼叫的Dropbox的根路徑。取決於應用程序的訪問類型的根路徑,可以是“保管箱”,如果應用程序具有完全訪問權限或“沙箱”,如果應用程序具有有限的訪問。如果此值不匹配的應用程序的遠程設置,則返回一個錯誤。
每個方法執行的共同步驟是:
檢查和准備參數列表。
執行HTTP調用。
解析並返回響應。
的AccountInfo()方法是最簡單的調用不帶參數的URL,並返回響應的關聯數組。
list.php的文件元數據()方法來獲取和顯示目錄的內容。唯一需要的參數是檢查的文件或目錄的路徑,但它允許我們指定相應的API調用的所有其他參數。如果$ PATH參數是一個文件,返回的數組包含元數據。如果它是一個文件夾,內容項包含它的文件列表,除非美元列表參數是假的。我們可以與內容的大小限制$ fileLimit參數(最多為最大25000),我們可以問一個特定的文件或文件夾(有關詳細信息,請參閱API參考)修訂。
重要的是要注意,在Dropbox API返回為每個呼叫的哈希值。如果我們要列出文件夾的內容,並提供一個哈希參數自上次調用改變我們的方法,API檢查是否輸出。如果不是,它返回一個301狀態代碼(不能修改)。Dropbox的團隊建議緩存的結果,並依靠這些文件夾列表值來優化性能。
GETFILE()方法用於檢索存儲在用戶的Dropbox的文件。整個文件內容被返回調用成功案例,其元數據存儲在自定義HTTP頭中的X-Dropbox的元數據作為一個JSON字符串。這種方法的返回值是一個關聯數組,包含名稱,MIME類型,元數據和內容。此外,我已經添加了$ outfile中的參數直接保存在磁盤上的文件。
download.php文件顯示了這種操作方法的演示。在這個例子中,下載的文件直接保存到應用程序的數據目錄,並響應的部分內容被清空。
PUTFILE()方法,從我們的本地存儲到用戶的Dropbox的文件上傳使用PUT HTTP方法,這是Dropbox的球隊,而不是發表的首選。此方法檢查本地文件存在,並且不超過150MB API的限制之前,任何其他共同行動。
支持此方法的參數,除了源文件的路徑,目標文件夾,一個可選的替代名稱和覆蓋選項。如果這最後一個選項是假的,並且存在遠程文件,上傳的文件是一個漸進的數字命名(例如,成為test.txt的測試(1)。TXT)。API還允許一個可選的parent_rev參數來管理修改,但為了讓事情變得簡單我決定忽略它。
總結
這只是一小部分的Dropbox的API,但它可以作為一個起點,以開發自己的應用程序不夠。對我來說,也是一個很好的機會,發揮與OAuth的。隨時改進和擴大,伴隨著這篇文章,以滿足您的需求,並一如既往:快樂編碼的代碼!

作者:newcnzz

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved