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

На данный момент у нас уже есть информация о том как загрузить документ на сервер и получить список всех документов, используя Delphi и Google Docs List API. Теперь разберемся каким образом можно скачать необходимый документ с сервера и при этом автоматически его экспортировать в различные форматы, поддерживаемые в Google Docs.

Для того, чтобы загрузить документ с сервера нам необходимо знать его ID (значение узла ResourceId из списка документов) и формат в котором мы хотим получить документ.
Шаблон URL для загрузки документа должен быть следующим:

https://docs.google.com/documents/Export?docID=resource_id&exportFormat=format

Параметр Format может иметь следующие значения для текстовых документов (Documents):

  1. doc— документ в формате Microsoft Word
  2. html документ в формате HTML
  3. odt документ в формате Open Document Format (Open Office)
  4. pdf документ в формате Portable Document Format
  5. png документ в формате Portable Networks Graphic. Если документ содержит несколько страниц текста, то вернется картинка, содержащая только первую страницу документа.
  6. rtf Rich Format
  7. txt текстовый
  8. zip ZIP архив, который будет содержать HTML-страницу с текстом документа и всеми изображениями

Как получить ResourceID — читайте здесь. И приступим к закачке. Во-первых, что касается ID. В XML-документе, содержащем список всех документов, узел ResourceID содержит примерно следующую строку:

document:1BOl2E3UaWDJ1mjOGY8J1BaJgYCWb1mV8rXskXCQlxI8
это означает, что id документа 1BOl2E3UaWDJ1mjOGY8J1BaJgYCWb1mV8rXskXCQlxI8, тип документа — текстовый. Соответственно, если речь идёт о таблице, то ResourseId будет содержать, например, такое значение:

spreadsheet:0AiBLPvZ9KKtJdDdnbWRyU0thUGRxRDZSVEhKRXVzbHc
Если мы подставим это значение как есть в URL, то сервер вернет нам ошибку, т.к. кроме id строка будет содержать и тип документа, поэтому всё, что стоит до запятой включительно требуется «отрубить». После этого можно отправоять GET-запрос на скачивание документа.
var HTTP: THTTPSend;
begin
try
  HTTP:=THTTPSend.Create;
  //вставляем заголовки авторизации
  HTTP.Headers.Add('GData-Version: 3.0');
  HTTP.Headers.Add('Authorization: GoogleLogin auth='+Edit3.Text);//всавляем Auth
 
  URL:='http://docs.google.com/feeds/download/documents/Export?docID=%s&exportFormat=%s';
 
  URL:=Format(URL,[res_id,'png']);
 
  if HTTP.HTTPMethod('GET',URL) then
    begin
      HTTP.Document.SaveToFile('file.png');
      Memo1.Lines.Add('-----------------------------');
      Memo1.Lines.Add(HTTP.Headers.Text);
      Memo1.Lines.Add('-----------------------------');
    end

Здесь мы скачиваем документ в формате png и выводим полученные заголовки в Memo1. Почему именно заголовки, а не, что-то другое?
Во-первых, для того, чтобы видеть вообще, что возвращает сервер. А именно: при первом запросе сервер возвращает всегда 3хх код статуса и новый URL по которому лежит наш документ. Поэтому нам необходимо по-мимо простой отправки запроса ещё и обеспечить обработку редиректа. Сделать это можно, воспользовавшись, например, моим class helper’ом для Synapse, который обеспечит авторедирект на полученный URL и при это сохранит все заголовки авторизации.

Во-вторых, в приведенном выше коде мы сохраняем файл с совершенно непонятным именем file.формат. А как быть если мы грузим два документа подряд? Для этого нам и потребуется знание того, какие заголовки присылает нам сервер. Имя файла документа возвращается в следующем заголовке:

Content-Disposition: attachment; filename="Имя файла.doc.png"

И для того, чтобы сохранить файл с его родным именем, нам необходимо узнать значение заголовка Content-Disposition и вытащить из его значения всё, что стоит filename. Чтобы узнать значение заголовка Вы, опять же, можете воспользоваться class helper‘ом.

Также для сохранения файла с его именем можно воспользоваться данными из списка документов — узлом title элемента entry.

На сегодня, пожалуй, всё. Теперь мы можем загружать/скачивать документы с сервера и получать из список. Дело движется к оформлению всей информации в один общий модуль и небольшую Demo-программу, но об этом в следующий раз :)

Книжная полка

Описание: Рассмотрены практические вопросы по разработке клиент-серверных приложений в среде Delphi 7 и Delphi 2005 с использованием СУБД MS SQL Server 2000, InterBase и Firebird. Приведена информация о теории построения реляционных баз данных и языке SQL. Освещены вопросы эксплуатации и администрирования СУБД.
купить книгу delphi на ЛитРес
Описание: Рассмотрены малоосвещенные вопросы программирования в Delphi. Описаны методы интеграции VCL и API. Показаны внутренние механизмы VCL и приведены примеры вмешательства в эти механизмы. Рассмотрено использование сокетов в Delphi: различные режимы их работы, особенности для протоколов TCP и UDP и др.
купить книгу delphi на ЛитРес
0 0 голоса
Рейтинг статьи
уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
Подписаться
Уведомить о
5 Комментарий
Межтекстовые Отзывы
Посмотреть все комментарии
Чорны кашак
02/10/2010 01:23

Сегодня первое октября ;)

Чорны кашак
02/10/2010 01:24

Опс, сорри — а что за время такое на серваке?

Misha
Misha
11/10/2010 06:13

Не подскажите аналогичную процедуру, но для PHP.
есть айди файла, доступ на директорию, даже доступ к файлу через бразуер есть если ткунть прямую ссылку ttp://docs.google.com/feeds/download/documents/Export?docID=%s&exportFormat=%s,
а вот копирование с гугла на сервер не работает