Heim >php教程 >php手册 >使用PHP访问Dropbox

使用PHP访问Dropbox

WBOY
WBOYOriginal
2016-06-13 10:51:451150Durchsuche

在这篇文章中,我们将探讨在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文件,如果存在,将被纳入这个脚本后。令牌文件的内容将类似于:
$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文件将是真实的:
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
Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn