PHP и Dropbox. Удаленное хранилище пользовательских файлов

Применение


Довольно часто при разработке веб-приложений приходится задумываться над вопросом организации стабильного хранилища пользовательских файлов. И если при этом мы ограничены дисковым пространством, то создание обмена файлами средней тяжести, да еще и с резервным копированием оных, сильно нас озадачивает.

Решение


В качестве решения я предлагаю схему PHP<->Dropbox. Dropbox нам интересен тем, что каждому новому пользователю выделяеся 2Gb виртуального дискового пространства, а так же возможность отката на предыдущие версии файлов. Это обеспечивает нам стабильное хранилище, в котором не возникнет случаев безвозвратно удаленных файлов.

Настройка



Подготовка

Для начала нам необходимо добавить в PHP библиотеку Oauth:
sudo pecl install oauth


Если возникает ошибка при компиляции, то ставим девелоперскую версию PECL:
sudo apt-get install libpcre3-dev


Затем добавляем в php.ini:
extension=oauth.so

Установка

Для дальнейшей работы нам необходимо скачать библиотеку для работы с Dropbox на PHP. После загрузки распаковываем из архива папку Dropbox в каталог скриптов нашего приложения, рядом расположите файлы из папки examples. На этих примерах я покажу, как можно:
  • создавать новый аккаунт Dropbox
  • загружать файлы в аккаунт Dropbox
  • получать эти файлы
  • удалять файлы


Работа

Сразу предупрежу, что для работы нам необходим аккаунт на Dropbox, через который мы зарегистрируем свое новое приложение и получим для него ключи. Зарегистрироваться можно на сайте Dropbox. После регистрации посетите раздел для разработчиков и добавьте свое новое приложение. Вы получите App keys (Key и Secret), которые позволят нашему приложению работать с Dropbox.

Создание пользователя

Теперь откройте файл createaccount.php, который вы распаковали рядом с папкой Dropbox. Задайте значения для переменных consumerKey и consumerSecret:

$consumerKey = ''; // ваш Key, выданный Dropbox
$consumerSecret = ''; // ваш Secret, выданный Dropbox


Теперь установите необходимые параметры функции createAccount():

var_dump($dropbox->createAccount('mrhandsome@example.org','Mr','Handsome','password goes here'));


Запустите этот скрипт и, тем самым, вы создадите новый аккаунт на Dropbox (например для нового пользователя вашего сайта).

Загрузка файла на Dropbox

Теперь для загрузки файла в хранилище созданного пользователя необходимо создать новый скрипт:

<?php
$consumerKey = ''; // ваш Key, выданный Dropbox
$consumerSecret = ''; // ваш Secret, выданный Dropbox

include 'Dropbox/autoload.php';

$oauth = new Dropbox_OAuth_PHP($consumerKey, $consumerSecret);
$dropbox = new Dropbox_API($oauth);


// Авторизация
$tokens = $dropbox->getToken('mrhandsome@example.org', 'secretpassword'); 
$oauth->setToken($tokens);

$h = fopen('/local/path/to/file','r'); // открываем загружаемый файл
$dropbox->putFile('newPath.txt',$h); // загружаем
?>


Скачивание файла с Dropbox

Для скачивания файла создадим скрипт с таким же содержанием, но вместо функции putFile() мы используем getFile();
echo( $dropbox->getFile('newPath.txt') );


Удаление файлов на Dropbox

Для удаления по-аналогии используем delete();
$dropbox->delete('newPath.txt');


Статистика по аккаунту

Для контроля за свободным местом на Dropbox используйте следующее:
var_dump($dropbox->getAccountInfo());

Этот метод выдает статистику по пользователю и по занятому дисковому пространству. Думаю, что 2Gb под личные файлы пользователя — вполне достаточно, но если все-таки он его заполнит, то можно предупреждать пользователя о том, что скоро ему придется что-то удалить.

Заключение


В заключении хочу добавить, что я перечислил только самые основные функции. Рекомендую ознакомиться с API Dropbox для PHP, чтобы использовать максимум возможностей интеграции.
Share post
AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 26

    +10
    У dropbox есть проблема с числом активных соединений — они лочат аккаунты, если число соединений будет велико. Т.ч. может получиться так, что это беплатное хранилище в один момент внезапно запретит к себе доступ.
      –1
      Спасибо за информацию. Это можно обойти, загрузив в темповую директорию на нашем сервере файл, хранящийся на дропбоксе. Делать это можно при обращении пользователя к файлу. Затем хранить его на нашем сервере до тех пор, пока все параллельные запросы на его скачивание прекратятся. Это так же избавит от необходимости постоянно грузить файл с дропбокса, потом отдавать клиентам.
        +1
        Резко возрастет трафик на сервере + все-равно нужно дисковое пространство на сервере для хранения этих временных файлов. Если одновременно качаются 10-20 файлов с объемом 100-200 метров но это нормально, а если больше — то можно забить место на сервере полностью. Ну и лучше хранить файл не до прекращения запросов, а чуть дольше (плюс час например).
          0
          Согласен, но трафик в любом случае придется обеспечивать, при любой организации файлообмена (если конечно не хранить ссылки на файл, хранящийся на внешнем сервере). Дропбокс, к сожалению, прямых линков дать не может.
        0
        А есть ссылка где можно про это подробнее прочитать? в частности интересует конкретное число подключений, после которого они начинают ругаться?
          0
          На форуме дропбокса для разработчиков ответ от саппорта:
          I'm not aware over any current limits to the Shareable Links, but we do monitor them for abuse none the less.
          We might put some limits on them in the future, depending upon the bandwidth consumption generated by them.

          Dropbox might not place any restrictions on the downloads


          forums.dropbox.com/topic.php?id=29712&replies=11#post-188436
        0
        Все очень заманчиво. А с русскими именами работает корректно?
          –1
          Возникли проблемы с русскими именами. В любом случае хранение файлов с кириллическими символами в названии — не очень хорошо. Лучше обработать название.
          +2
          www.dropbox.com/terms

          General Prohibitions
          You agree not to do any of the following while using the Site, Content, Files or Services:

          Attempt to access or search the Site, Content, Files or Services with any engine, software, tool, agent, device or mechanism other than the software and/or search agents provided by Dropbox or other generally available third-party web browsers (such as Microsoft Internet Explorer or Mozilla Firefox), including but not limited to browser automation tools;
            +1
            Зачем же они тогда API придумали?
              0
              Еще раз подумал и понял, что в соглашении говорится об использовании сторонним ПО сервисов Дропбокса, функционала сайта Дропбокса и т.п. дабы не нагружать сервера дропбокса доп. вычислением. В данном случае мы разбираемся с файлами самостоятельно, а с дропбокса качаем свои-же файлы — это не запрещено.
                0
                Site, Content, Files or Services:
                  0
                  Site, Content, Files — здесь имеется ввиду сайт Дропбокса, его контент и файлы. Разрешено использование этих материалов только браузером и программами дропбокса.
            • UFO just landed and posted this here
              +6
              Еще вариант, можно хранить пользовательские файлы в виде сообщений в твиттере.
                +1
                Снова и снова вспоминается хранение файлов в GMail. Но ваш вариант, несомненно, заслуживает реализации.
                –1
                а почему именно Dropbo, а не Amazon S3, например?
                  0
                  Бесплатность например.
                  0
                  для своего проекта ищу файловое хранилище для фотоматериала пользователей, рассматривал amazon s3, ваш вариант подходит заочно идеально, попробуем. спасибо.
                    +1
                    если использовать как файловое хранилище (загрузил, раз в месяц скачал три файла), то дропбокс подойдёт, а если как хостинг файлов (сотни скачиваний в день), то вас быстро заблокируют
                      +1
                      Я в курсе сих ограничений, предполагается 1-3 загрузки в месяц и 1 скачивание. Как вариант сойдет, Фаворит все же amazon s3.
                    +2
                    Я уже имею опыт использования дропбокса на продакшн-сервере. Из интересного: путем инвайтов аккаунт можно раскачать до 8 гигабайт (читерский метод — использование виртуальных машин, на которые можно ставить дропбокс, чтобы завершить регистрацию инвайта, но в моем случае — просто настойчиво рекомендовал друзьям — им понравилось)

                    Есть и некоторые сложности, например, полное удаление файла (purge) может сделать только тот пользователь, которые его залил, что может создать проблемы в будущем при очистке с целью сохранить место в выделенных гигабайтах.

                    Из основных плюсов — очень легко организовывать совместную работу, благодаря уведомлениям, которые показываются при обновлении файлов — контент-менеджеры видят изменения друг друга прямо в момент сохранениния файла. Также история изменений в виде ленты позволяет мне находить те проблемы, которые контентщики создают неправильными изменениями.

                    В целом, есть масса удобных кейсов для использования этой технологии, можно рекомендовать.
                      0
                      А кто нибудь сталкивался с ошибкой Fatal error: Uncaught exception OAuthException with message Invalid auth/bad request (got a 401, expected HTTP/1.1 20X or a redirect)?

                      Как победить сиё чудо, код один в один как из примера в топике выше.
                        0
                        Стоп вы хотите сказать что в дропбоксе вот так просто можно создать аккаунты пользователям моего сайта без их ведома и получить с каждого по 2 гига?

                        Only users with full accounts can post comments. Log in, please.