В предыдущей части обзора компонентов TMS Cloud Pack я рассматривал работу с Google Calendar и конечный мой вывод был не в пользу TMS Software — компонент AdvGCalendar необходимо дорабатывать, т.к. в нынешнем его состоянии использовать такой компонент в серьезных приложениях не серьезно (простите за каламбур). Но и делать вывод о полезности или бесполезности целого пакета компонентов, основываясь лишь на работе одного единственного компонента я считаю не правильным и сегодня буду рассматривать работу с Dropbox.
Надо сказать, что с API Dropbox работал я не так плотно и плодотворно, как с Google API, поэтому периодически в обзоре я буду сорить ссылочками на официальную документацию сервиса, чтобы и Вам было понятнее о чем идет речь и мне, в случае чего, можно было потом восстановить весь ход работы с этим сервисом. Итак, начнем обзор компонента AdvDropbox из пакета TMS Cloud Pack 2.0.0.0.
Предварительная подготовка к работе с Dropbox API
Прежде всего нам необходимо завести аккаунт на dropbox.com. После этого мы можем получить возможность работать с API сервиса. Dropbox предлагает разработчикам два интерфейса:
- Core API — основной интерфейс, который позволяет работать с папками и файлами в аккаунте пользователя, получать и обновлять сведения о документах и т.д.
- Sync API — API синхронизации. Этот интерфейс можно использовать, чтобы получать уведомления об изменении файлов в аккаунте и разработке собственного клиента Dropbox для синхронизации данных на локальном компьютере с аккаунтом.
Забегая чуть-чуть вперед, скажу сразу, что компонент AdvDropbox использует только Core API. В принципе, при необходимости разработки клиента для синхронизации данных и этой реализации может быть вполне достаточно, если API будет реализован на достаточном для нормальной работы уровне.
После того, как аккаунт зарегистрирован, нам необходимо зарегистрировать наше новое приложение для работы с Dropbox. Смысл регистрации примерно тот же, что и при работе с Google API, т.е.:
1. Заходим в консоль приложений Dropbox и жмем большую синюю кнопку «Создать приложение»:
2. Выбираем тип используемого API, задаем название приложения и указываем уровень доступа. Чтобы воспользоваться компонентом от TMS нам необходимо выбрать значения как показано на рисунке ниже:
то есть указываем, что использовать мы будем Core API и будем просить у пользователя полный доступ к аккаунту.
3. Снова жмем синюю кнопочку «Создать приложение» и, если все в порядке (имя приложения не занято), то вы получите от DropBox два ключика: App Key и App Secret:
Теперь можно приступать к работе с компонентом.
Авторизация пользователя в Dropbox и получение информации об аккаунте
Авторизация пользователя в Dropbox происходит точно так же, как и в Google. То есть, задаем в компоненте значения свойств:
App.Key App.Secret
После чего вызываем метод авторизации:
AdvDropBox.DoAuth
И отлавливаем событие компонента OnReceivedAccessToken. Как только событие прошло, ключ доступа будет лежать в свойстве:
AdvDropBox.TokensAsString
и мы сможем использовать любые методы компонента для работы с информацией в аккаунте пользователя.
Для примера, посмотрим как получить основную информацию об аккаунте пользователя. В тестовом приложении я разместил на главной форме Memo и кнопку, клик по которой запускает процесс авторизации. Обработчик события OnReceivedAccessToken у компонента AdvDropbox я сделал таким:
procedure TForm6.AdvDropBox1ReceivedAccessToken(Sender: TObject); begin AdvDropBox1.GetAccountInfo; //получаем информацию об аккаунте Memo1.Lines.Add('User Name: '+AdvDropBox1.Info.UserName); Memo1.Lines.Add('Country: '+AdvDropBox1.Info.Country); Memo1.Lines.Add('Quota: '+FloatToStr(AdvDropBox1.Info.Quota)); Memo1.Lines.Add('Quota Normal: '+FloatToStr(AdvDropBox1.Info.QuotaNormal)); end;
В итоге я получил в Memo следующую информацию о своем аккаунте Dropbox:User Name: Vlad Bajenov
Country: RU
Quota: 4697620480
Quota Normal: 3577867096
При этом значение Quata — это общее место в аккаунте, а Quota Normal — использованное место под файлы.
После того, как мы получили ключ доступа к аккаунту и проверили его (аккаунта) состояние, мы можем спокойно приступать к работе с файлами и папками.
Работа с метаданными в аккаунте Dropbox
Для того, чтобы получить информацию о файлах и папках в аккаунте пользователя нам необходимо воспользоваться методом:
AdvDropBox1.GetDriveInfo
Что он делает и как работает? Привожу цитату из официальной документации TMS:
Calling the method TAdvXXXDrive.GetDriveInfo will use the cloud storage API to query the list of all files and will store this hierarchically in the Drive: TCloudItems collection property.
То есть, при вызове этого метода выполняется запрос к сервису, в результате чего нам должен возвратиться список всех файлов в аккаунте, разложенный в иерархическом порядке в свойстве компонента:
Drive: TCloudItems
Для удобства работы с компонентом, разработчики предусмотрели небольшой удобный метод:
AdvDropBox1.FillTreeView
с помощью которого можно выстроить всю иерархию документов и папок аккаунта в TreeView. Соответственно, информацию для работы этого методы выбирается из коллекции Drive.
Для примера я решил запросить информацию по своему аккаунту. На данный момент состав папки Dropbox у меня следующий:
Итак, бросаем на форму компонент TreeView и пишем вот такой незамысловатый код:
AdvDropBox1.GetDriveInfo; AdvDropBox1.FillTreeView(TreeView1); ShowMessage('TreeView1.Items.Count '+IntToStr(TreeView1.Items.Count));
Запускаем приложение и получаем следующее сообщение:
То есть, на деле запрос GetDriveInfo вернул нам всего 50 элементов из 8150 обещанных в документации. В принципе, такой подход к получению метаданных из аккаунта (то есть получение списка по частям по 50, 100, 150 и т.д. штук) имеет смысл — мы ведь не можем знать, что там у пользователя твориться в аккаунте — может у него там миллион файлов и получение списка на такое количество элементов может занять довольно продолжительное время. Но и по 50 штук получать как-то не серьезно, учитывая, что Dropbox API высылает документы в JSON. И здесь мы упираемся в тот же недостаток компонента, что и в предыдущем случае, а именно:
Как быть сейчас, чтобы все-таки вытащить в программу всю информацию по файлам и папкам в аккаунте? По логике вещей нам должен бы помочь метод:
GetFolderInfo(const FolderName: string; Items: TDropBoxItems)
Но, то ли я чего-то не понял, то ли что-то ещё, короче всяческие попытки вызова этого метода для папок в аккаунте ни к чему не привели.
Ещё один момент по работе с метаданными аккаунта.
Чтобы повторить баг (именно баг, а не фичу) достаточно выполнить следующие действия:
- Создаем в корне аккаунта новую папку, например, «Новая папка 1»
- В этой папке создаем новую папку — «Новая папка 2»
- повторяем п.1-2 сколько угодно раз, главное чтобы папки назывались по-русски.
- Возвращаемся в корневую директорию и повторяем п.1-3, но новые папки уже называем по-английски или цифрами.
- Выполняем методы GetDriveInfo, FillTreeView и наблюдаем следующую картинку: в дереве TreeView «Новая папка 1» есть, но у неё нет ни одной поддиректории, а иерархия папок, названных по-английски или цифрами — прекрасно построилась.
Вполне возможно, что из-за этого бага и у меня возвращается всего 50 из 8150 элементов, т.к. большинство документов и папок в аккаунте у меня носят названия именно на русском языке.
Работа с файлами и папками
Компонент AdvDropBox позволяет выполнять следующие операции над файлами и папками:
- Загружать файлы
- Скачивать файлы
- Создавать и удалять папки
- Открывать доступ к файлам и папкам
Для визуализации процесса закачки/скачивания файлов можно воспользоваться двумя событиями компонента:
TOnUploadProgress = procedure (Sender: TObject; FileName: string;Position, Total: Int64) of object; TOnDownloadProgress= procedure (Sender: TObject; FileName: string; Position, Total: Int64) of object;
Загрузка файла в аккаунт
Для начала бросим на форму ProgressBar и напишем такой обработчик события TOnUploadProgress:
procedure TForm6.AdvDropBox1UploadProgress(Sender: TObject; FileName: string; Position, Total: Int64); begin ProgressBar1.Max:=Total; ProgressBar1.Position:=Position; end;
Теперь попробуем загрузить какой-нибудь файл в самую первую папку Dropbox. Например, так:
AdvDropBox1.Upload(AdvDropBox1.DDrive.Items[0],Application.ExeName)
Все прошло замечательно — никаких проблем с загрузкой не возникло. Правда очень уж медленно файлик закачивался, но вполне вероятно, что это уже ограничение самого API. Да и сам компонент видимо использует самый безопасный метод загрузки — chunked_upload, что тоже влияет на скорость работы.
Скачивание файла
Теперь попробуем скачать файл. Я решил сильно не заморачиваться и скачать ровно то, что и закачал ранее, т.е. сразу после выполнения метода Upload вызвал обратный метод — Download:
var DI: TDropBoxItem; begin DI:=AdvDropBox1.Upload(AdvDropBox1.DDrive.Items[0],Application.ExeName); AdvDropBox1.Download(DI, 'Target.exe'); end;
Как и ожидалось, здесь тоже никаких проблем не возникло, а сама закачка файла выполнилась быстрее, чем загрузка в аккаунт.
Для порядка проверил также загрузку и скачивание файлов с русскими буквами в названии — проблем никаких не возникло. Правда возник другой баг —
Я бы на месте разработчиков все-таки проверял перед началом загрузки существование и доступность файла и все-таки сделал бы корректную обработку исключения.
Открытие доступа к файлам и папкам
Чтобы открыть доступ к файлу или папке необходимо вызвать метод:
function GetShare(Item:TDropBoxItem): string
В результате нам вернется короткая ссылка для доступа к файлу.
Создание папок
Для создания новой папки в аккаунте необходимо вызвать метод
function CreateFolder(Item:TCloudItem; FolderName:string):TCloudItem
Проверил работу этого метода — вроде бы никаких проблем не возникло. Папки создаются корректно, баг с юникодом не вылез.
Итог
Что можно сказать в итоге про работу с компонентом?
Начнем с положительных моментов. Надо сказать, что работать с компонентом вполне удобно. Хоть в жертву простоте разработчики почему-то принесли возможности API, но тем не менее, с помощью TAdvDropBox можно было (бы) организовать довольно сносную поддержку Dropbox в своих Delphi-приложениях.
Однако проблемы работы компонента с элементами, имеющими юникодные названия напрочь перечеркивает, по крайней мере для меня, возможность использования этого компонента в приложениях.
Общий мой вывод по компоненту будет таков: компонент требует доработки. Если Вы все же решитесь его использовать, то будьте готовы к неприятным «сюрпризам»
Надеюсь, что к версии 3.0. компонент станет полностью работоспособным и тогда я с очень большой радостью изменю свое мнение относительно TMS Cloud Pack.
Книжная полка
Описание: Рассмотрены практические вопросы по разработке клиент-серверных приложений в среде Delphi 7 и Delphi 2005 с использованием СУБД MS SQL Server 2000, InterBase и Firebird. Приведена информация о теории построения реляционных баз данных и языке SQL. Освещены вопросы эксплуатации и администрирования СУБД.
|
||
Название: О чем не пишут в книгах по Delphi
Описание: Рассмотрены малоосвещенные вопросы программирования в Delphi. Описаны методы интеграции VCL и API. Показаны внутренние механизмы VCL и приведены примеры вмешательства в эти механизмы. Рассмотрено использование сокетов в Delphi: различные режимы их работы, особенности для протоколов TCP и UDP и др.
|
Где то с полгода назад для одной задачи понадобился облачный диск, я тогда рассматривал варианты с DropBox и Яндекс.Диск. И у дропбокса, если мне не изменяет память, на бесплатном аккаунте необходимо было каждый раз подтверждать доступ для своего приложения, т.е. при каждом запуске приходилось лезть в браузер на страницу дропбокса и жать кнопочку с подтверждением (я даже пытался автоматически это делать прямыми POST запросами из под капота приложения, но к удивлению не удалось), хотя само приложение было добавлено в список приложений и доступ был настроен. Или я чего то не понял? P.S. в итоге остановился на Яндекс.Диске — никаких ограничений,… Подробнее »
DesweR, с Dropbox вы видимо чего-то недопоняли. Там всю дорогу используется OAuth 1.0. для авторизации и доступа к ресурсам API (OAuth 2.0 сейчас в стадии бета-тестов). А раз используется OAuth 1.0. то надо было в параметрах каждого запроса передавать токен доступа и служебную инфу по OAuth..сейчас не покню, но по-моему запрос должен содержать 4 параметра OAuth. Ну и, естественно, надо было использовать шифрование HMAC-SHA1.
Комопнент из статьи, хоть и не айс, но, тем не менее OAuth 1.0. в нем реализован можно даже сказать, что замеательно
Вот сейчас откопал свою старую учётку на дропбоксе, скачал демки TMS Cloud Pack и проверил: Открылась та же страничка с разрешением доступа для приложения: И разрешать приходится каждый раз. Точнее так: один раз зашли на страницу — авторизовались — подтвердили — всё, не нужно больше ничего подтверждать, но! стОит выйти на странице из аккаунта и запустить заново приложение — его потребуется снова подтверждать). Попробовал добавить новое приложение и подключиться через него — та же история. Если что, вот скрин из консоли приложений: А если глянуть в исходники аналогичного компонента от Astonsoft, то вот что там можно увидеть: 1. Сначала собираем… Подробнее »
Какая то чертовщина, подключался (от трех или более раз) под ключами для старого приложения (и через демку TMS и через демку Astonsoft) — просили подтверждения. Добавил новое приложение, попробовал пару раз подключится (и через TMS и через Astonsoft) — сначала просили подтверждение, потом уже не просили, выходил из аккаунта и подключался снова — опять просили. И тут вдруг для нового приложения перестали просить подтверждения, даже перезагрузился и заново попробовал — не просят. Но! Теперь не могу подключится через старое приложение, вообще не могу (через Astonsoft — ошибка 403, через TMS — после авторизации просто на главную перекидывает), перезагрузился опять, проверил… Подробнее »
DesweR, действительно — чертовщина..у меня вообще один раз попросил Dropbox подтверждение и все — работает как надо, единственное, что делаю — это раз в час RefreshToken и все Но у меня постоянно на компе клиент dropbox пашет — может из-за этого все так гладко
Vlad, есть ли у Вас какое-нибудь описание AdvStringGrid ?
Александр, нет, к сожалению, с этим компонентом я никогда не работал