По сути, я создал контейнер внутри Rackspace Cloud Files, скажем, work
, внутри work
У меня так много папок по имени пользователя (динамические папки, когда новые пользователи регистрируются и выделяют 1 ГБ места). Каждый раз, когда пользователь загружает файл, я хочу проверить, превышает ли пользователь свой лимит, прежде чем разрешить ему загрузку. Я использую Laravel PHP Framework вместе с Rackspace Open Cloud SDK.
Вопросы:
Я хочу получить размер папки конкретного пользователя, созданной в главном контейнере («xyz»).
Есть ли другой способ достичь того, превысил ли пользователь предел или нет?
- Я хочу получить размер папки конкретного пользователя, созданной в главном контейнере («xyz»).
При выполнении списка контейнеров, вы можете предоставить параметр запроса «prefix» и «format» возвращать только те объекты, которые начинаются с определенного префикса (в вашем случае это имя пользователя), и возвращать результаты в формате 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"},
...
]
НОТА: С этим решением, если вы получите 10 тыс. Объектов, вы захотите изучить использование параметра запроса «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";
- Есть ли другой способ добиться того, превысил ли пользователь предел или нет.
Если у вас есть ограничения в отношении того, насколько быстро будут расти ваши пользователи, или вы можете ограничить общее количество пользователей, то вы можете рассмотреть возможность создания контейнера для каждого пользователя. Недостатком этого является то, что вы ограничите количество пользователей, которых вы можете поддерживать, максимальным количеством контейнеров на учетную запись (500 000). Но это позволит вам использовать квота контейнера особенность. Используя эту функцию, если вы попытаетесь положить объект и превысили квоту, вы получите ответ HTTP 413. Вы также сможете проверить использование пользователя с помощью заголовка «X-Container-Bytes-Used».
НОТА: Ранее я упоминал «окно согласованности». В некоторых случаях списки / квоты контейнеров могут обновляться не сразу, но в конечном итоге они обновляются. В большинстве ситуаций эта задержка либо незаметна, либо минимальна. Однако, если ваш вариант использования требует, чтобы пользователям абсолютно не разрешалось загружать за пределы своей квоты, вам, возможно, придется искать альтернативный метод для отслеживания использования пользователя (например, локальная база данных).
Других решений пока нет …