如何使用PHP从Rackspace Cloud Files容器中的文件夹获取文件夹大小?

时间:2015-01-22 09:22:23

标签: php laravel rackspace rackspace-cloudfiles php-opencloud

基本上我在Rackspace Cloud Files中创建了一个容器,比方说work。在work内部我有很多用户名的文件夹(动态文件夹作为新用户注册并分配1 GB的空间)。每次用户上传文件时,我都想在允许用户上传之前检查用户是否超出限制。我正在使用Laravel PHP Framework以及Rackspace开放云SDK。

问题:

  1. 我想获取在主容器(" xyz")下创建的特定用户文件夹的文件夹大小。

  2. 有没有其他方法可以实现用户是否超出限制?

1 个答案:

答案 0 :(得分:2)

  
      
  1. 我想获取在主容器(" xyz")下创建的特定用户文件夹的文件夹大小。
  2.   

执行容器列表时,您可以提供"prefix" and "format" query parameter仅返回以特定前缀(在您的情况下为用户名)开头的对象,并以JSON / XML格式返回结果。当以JSON或XML返回结果时,它们包含有关对象的其他信息。以下是JSON响应的示例:

[
    {
        "bytes": 13,
        "content_type": "text/plain",
        "hash": "8ddd8be4b179a529afa5f2ffae4b9858",
        "last_modified": "2015-01-27T00:08:44.671230",
        "name": "<username>/some_object.txt"
    },
    ...
]

注意:使用此解决方案,如果您返回10k个对象,则需要查看使用“marker”查询参数来分页结果。

此外,您可能会考虑将用户分成多个容器。我们建议这样做有助于在最终的一致性窗口(后面有更多内容)方面获得更准确的结果。例如,创建容器“work_0”到“work_9999”,并确定哪些用户使用类似于以下内容的容器:

$user_md5 = md5($username);
// Only use part of the md5sum, unless you have support for big (128-bit) integers
$user_int = hexdec(str_split($user_md5, 7)[0]);
$container_id =  $user_int % 10000;
$container_name = "work_$container_id";
print "Container for user \"$username\" is \"$container_name\"\n";
  
      
  1. 是否有其他方法可以确定用户是否超出限制。
  2.   

如果您对用户增长的速度有限制,或者可以限制总用户数,那么您可以考虑为每个用户创建一个容器。不利的一面是,您将通过每个帐户的最大容器数量(500,000)限制您可以支持的用户数量。但它允许您使用container quota功能。使用此功能,如果您尝试PUT一个对象并超过配额,您将收到HTTP 413响应。您还可以使用&#34; X-Container-Bytes-Used&#34;来检查用户的使用情况。报头中。

注意:我之前提到过“最终一致性窗口”。在某些情况下,容器列表/配额可能不会立即更新,但最终会更新。在大多数情况下,这种延迟要么不明显,要么很小。但是,如果您的用例要求绝对不允许用户上传超出其配额,那么您可能必须寻找一种备用方法来跟踪用户的使用情况(例如本地数据库)。