уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.

В предыдущей части обзора компонентов 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 предлагает разработчикам два интерфейса:

  1. Core API — основной интерфейс, который позволяет работать с папками и файлами в аккаунте пользователя, получать и обновлять сведения о документах и т.д. 
  2. Sync API — API синхронизации. Этот интерфейс можно использовать, чтобы получать уведомления об изменении файлов в аккаунте и разработке собственного клиента Dropbox для синхронизации данных на локальном компьютере с аккаунтом.

Забегая чуть-чуть вперед, скажу сразу, что компонент AdvDropbox использует только Core API. В принципе, при необходимости разработки клиента для синхронизации данных и этой реализации может быть вполне достаточно, если API будет реализован на достаточном для нормальной работы уровне.

После того, как аккаунт зарегистрирован, нам необходимо зарегистрировать наше новое приложение для работы с Dropbox. Смысл регистрации примерно тот же, что и при работе с Google API, т.е.:

1. Заходим в консоль приложений Dropbox и жмем большую синюю кнопку «Создать приложение»:

Dropbox_console

 

2. Выбираем тип используемого API, задаем название приложения и указываем уровень доступа. Чтобы воспользоваться компонентом от TMS нам необходимо выбрать значения как показано на рисунке ниже:

Dropbox_console_2

 

то есть указываем, что использовать мы будем Core API и будем просить у пользователя полный доступ к аккаунту.

3. Снова жмем синюю кнопочку «Создать приложение» и, если все в порядке (имя приложения не занято), то вы получите от DropBox два ключика: App Key и App Secret:

Dropbox_console_3

 

Теперь можно приступать к работе с компонентом.

Авторизация пользователя в 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 у меня следующий:
Dropbox_app_1
Итак, бросаем на форму компонент TreeView и пишем вот такой незамысловатый код:

AdvDropBox1.GetDriveInfo;
AdvDropBox1.FillTreeView(TreeView1);
ShowMessage('TreeView1.Items.Count '+IntToStr(TreeView1.Items.Count));

Запускаем приложение и получаем следующее сообщение:
Dropbox_app_2
То есть, на деле запрос GetDriveInfo вернул нам всего 50 элементов из 8150 обещанных в документации.  В принципе, такой подход к получению метаданных из аккаунта (то есть получение списка по частям по 50, 100, 150 и т.д. штук) имеет смысл — мы ведь не можем знать, что там у пользователя твориться в аккаунте — может у него там миллион файлов и получение списка на такое количество элементов может занять довольно продолжительное время. Но и по 50 штук получать как-то не серьезно, учитывая, что Dropbox API высылает документы в JSON. И здесь мы упираемся в тот же недостаток компонента, что и в предыдущем случае, а именно:

необходима, как минимум, ещё одна версия метода GetDriveInfo, которая позволит мне, как разработчику, самому регулировать количество элементов возвращаемых в списке. И API это прекрасно позволяет сделатьвот ссылочка на тот самый метод, который используется в GetDriveInfo

Как быть сейчас, чтобы все-таки вытащить в программу всю информацию по файлам и папкам в аккаунте? По логике вещей нам должен бы помочь метод:

GetFolderInfo(const FolderName: string; Items: TDropBoxItems)

Но, то ли я чего-то не понял, то ли что-то ещё, короче всяческие попытки вызова этого метода для папок в аккаунте ни к чему не привели.

Ещё один момент по работе с метаданными аккаунта.

 

Как оказалось, компонент не умеет работать с папками, название которых состоит из русских букв.

Чтобы повторить баг (именно баг, а не фичу) достаточно выполнить следующие действия:

  1. Создаем в корне аккаунта новую папку, например, «Новая папка 1»
  2. В этой папке создаем новую папку — «Новая папка 2»
  3. повторяем п.1-2 сколько угодно раз, главное чтобы папки назывались по-русски.
  4. Возвращаемся в корневую директорию и повторяем п.1-3, но новые папки уже называем по-английски или цифрами.
  5. Выполняем методы GetDriveInfo, FillTreeView и наблюдаем следующую картинку: в дереве TreeView «Новая папка 1» есть, но у неё нет ни одной поддиректории, а иерархия папок, названных по-английски или цифрами — прекрасно построилась.

Вполне возможно, что из-за этого бага и у меня возвращается всего 50 из 8150 элементов, т.к. большинство документов и папок в аккаунте у меня носят названия именно на русском языке.

Работа с файлами и папками

Компонент AdvDropBox позволяет выполнять следующие операции над файлами и папками:

  1. Загружать файлы
  2. Скачивать файлы
  3. Создавать и удалять папки
  4. Открывать доступ к файлам и папкам

Для визуализации процесса закачки/скачивания файлов можно воспользоваться двумя событиями компонента:

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;

Как и ожидалось, здесь тоже никаких проблем не возникло, а сама закачка файла выполнилась быстрее, чем загрузка в аккаунт.

Для порядка проверил также загрузку и скачивание файлов с русскими буквами в названии — проблем никаких не возникло. Правда возник другой баг —

если в параметрах метода Upload указан несуществующий файл, то вываливается AV.

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

Открытие доступа к файлам и папкам

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

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 и др.
купить книгу delphi на ЛитРес
уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
7 Комментарий
Межтекстовые Отзывы
Посмотреть все комментарии
DesweR
25/06/2013 11:58

Где то с полгода назад для одной задачи понадобился облачный диск, я тогда рассматривал варианты с DropBox и Яндекс.Диск. И у дропбокса, если мне не изменяет память, на бесплатном аккаунте необходимо было каждый раз подтверждать доступ для своего приложения, т.е. при каждом запуске приходилось лезть в браузер на страницу дропбокса и жать кнопочку с подтверждением (я даже пытался автоматически это делать прямыми POST запросами из под капота приложения, но к удивлению не удалось), хотя само приложение было добавлено в список приложений и доступ был настроен. Или я чего то не понял? P.S. в итоге остановился на Яндекс.Диске — никаких ограничений,… Подробнее »

DesweR
25/06/2013 23:44
Ответить на  Vlad

Вот сейчас откопал свою старую учётку на дропбоксе, скачал демки TMS Cloud Pack и проверил: Открылась та же страничка с разрешением доступа для приложения: https://i46.fastpic.ru/big/2013/0625/03/940ad78cc96986854f042f603569ce03.png https://i46.fastpic.ru/big/2013/0625/2e/d548994feaf9f2a911483aea55e7a82e.png https://i46.fastpic.ru/big/2013/0625/8f/1682619d73c228bb68528ef772ae458f.png И разрешать приходится каждый раз. Точнее так: один раз зашли на страницу — авторизовались — подтвердили — всё, не нужно больше ничего подтверждать, но! стОит выйти на странице из аккаунта и запустить заново приложение — его потребуется снова подтверждать). Попробовал добавить новое приложение и подключиться через него — та же история. Если что, вот скрин из консоли приложений: https://i46.fastpic.ru/big/2013/0625/80/f295a8458b126a47eb59fe604fcb2180.png А если глянуть в исходники аналогичного компонента от Astonsoft, то вот что там можно… Подробнее »

DesweR
26/06/2013 00:59
Ответить на  DesweR

Какая то чертовщина, подключался (от трех или более раз) под ключами для старого приложения (и через демку TMS и через демку Astonsoft) — просили подтверждения. Добавил новое приложение, попробовал пару раз подключится (и через TMS и через Astonsoft) — сначала просили подтверждение, потом уже не просили, выходил из аккаунта и подключался снова — опять просили. И тут вдруг для нового приложения перестали просить подтверждения, даже перезагрузился и заново попробовал — не просят. Но! Теперь не могу подключится через старое приложение, вообще не могу (через Astonsoft — ошибка 403, через TMS — после авторизации просто на главную перекидывает), перезагрузился опять, проверил… Подробнее »

Александр
Александр
01/07/2013 17:48

Vlad, есть ли у Вас какое-нибудь описание AdvStringGrid ?