Среда, 12.08.2020, 06:41
Главная Регистрация RSS
Приветствую Вас, Гость
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум » Информационный центр » Программирование в Delphi 7 » Загрузить файл по HTTP
Загрузить файл по HTTP
AlexДата: Среда, 06.06.2012, 09:01 | Сообщение # 1
Генерал-полковник
Группа: Администраторы
Сообщений: 1088
Репутация: 1
Статус: Offline
Обычно при разработке приложений, которые планируется в дальнейшем обновлять и усовершенствовать, основные модули хранятся в виде пакетов (Package) или библиотек DLL. В настоящее время Internet предоставляет возможность без особых усилий осуществлять обновление этих модулей. Поэтому добавление к Вашему приложению функции авто-обновления, является наилучшим способом для обновления приложения.

Давайте посмотрим, как реализовывается данный механизм в любом FTP приложении.

Delphi предоставляет нам полный доступ к WinInet API (wininet.pas), который можно использовать для соединения и получения файлов с веб-сайта, который использует либо Hypertext Transfer Protocol (HTTP) либо File Transfer Protocol (FTP). Например, мы можем использовать функции из WinInet API для: добавления FTP браузера в любое приложение, создания приложения, которое автоматически скачивает файлы с общедоступных FTP серверов или поиска Internet сайтов, ссылающихся на графику и скачивать только графику.

Функция GetInetFile
Code
uses Wininet;  

function GetInetFile(const fileURL, FileName: string): boolean;  
const  
    BufferSize = 1024;  
var  
    hSession, hURL: HInternet;  
    Buffer: array[1..BufferSize] of Byte;  
    BufferLen: DWORD;  
    f: file;  
    sAppName: string;  
begin  
    Result := False;  
    sAppName := ExtractFileName(Application.ExeName);  
    hSession := InternetOpen(PChar(sAppName),  
    INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);  
    try  
      hURL := InternetOpenURL(hSession, PChar(fileURL), nil, 0, 0, 0);  
      try  
        AssignFile(f, FileName);  
        Rewrite(f,1);  
        repeat  
          InternetReadFile(hURL, @Buffer, SizeOf(Buffer), BufferLen);  
          BlockWrite(f, Buffer, BufferLen);  
        until  
          BufferLen = 0;  
        CloseFile(f);  
        Result := True;  
      finally  
        InternetCloseHandle(hURL);  
      end;  
    finally  
      InternetCloseHandle(hSession);  
    end;  
end;


Использование

Code
var  
    FileOnNet, LocalFileName: string  
begin  
    FileOnNet := 'http://its_your_site.ru/library/DelphiWorld.zip';  
    LocalFileName := 'C:\DelphiWorld.zip';  

    if GetInetFile(FileOnNet, LocalFileName) = True then  
      ShowMessage('Download successful')  
    else  
      ShowMessage('Error in file download');  
end;

Данный код запрашивает файл 'http://its_your_site.ru/library/DelphiWorld.zip' с сайта, скачивает его, и сохраняет его как 'C:\DelphiWorld.zip'.


 
AlexДата: Вторник, 07.08.2012, 13:16 | Сообщение # 2
Генерал-полковник
Группа: Администраторы
Сообщений: 1088
Репутация: 1
Статус: Offline
Использование HTTP в Delphi
Введение

В связи с все большим вниманием, которое привлекает к себе Интернет, все больше людей становятся заинтересованы в сетевых технологиях. Данная статья посвящена программированию на Borland Delphi с использованием одного из самых популярных Интернет-протоколов - HTTP.

А именно, здесь мы рассмотрим компонент TNMHTTP (NetMasters HTTP), который можно обнаружить на вкладке FastNet палитры компонентов Дельфи.

Начнем с теории. Если Вы уже знаете, что такое HTTP и зачем он нужен, то пропустите следующий раздел.
Зачем нужен HTTP

Итак, где же используется HTTP? Если Вы хотя бы чуть-чуть заглядывали на Интернет-странички и встречались с термином Web, то наверняка обратили внимание на то, что адреса страничек, как правило, начинаются с http://. Протокол HTTP (HyperText Transfer Protocol) позволяет принимать и посылать не только гипертекстовые документы (типа html), но и любые другие (тексты (txt), изображения (gif, jpg), и т.д.). Ниже приведены типовые задачи, для выполнения которых необходимо использовать HTTP:

Браузеры - программы, позволяющие просматривать Интернет-странички;
Скачивальщики - программы, позволяющие скачивать из Интернета странички, рисунки и другие документы;
Чаты - программы, позволяющие общаться по сети. Часто документы HTTP используются для хранения сообщений (как, например, в конференциях).

- Это лишь список некоторых из стандартных направлений программирования с использованием HTTP. Вы можете применять этот протокол для любых своих целей. Например, автоматические системы обновления данных, посылка запросов в Интернетовские базы, и еще множество всяческих других возможностей!
Краткое описание свойств, методов и событий

Ниже приведена таблица, содержащая наиболее краткое описание основных свойств, методов и событий компонента TNMHTTP:





Практика и примеры

Ну а теперь приступим к самому главному методу изучения - на примерах. Сразу замечу, что все приведенные здесь примеры можно скачать в полностью сделанных исходниках, щелкнув здесь.

И самый первый пример - программа, позволяющая определить, существует ли заданный URL:
Пример 1. Проверка существования указанной URL

{... Здесь идет заголовок файла и определение формы TForm1 и ее экземпляра Form1}

{ В форму нужно поместить кнопку TButton и одно поле TEdit. При нажатии на кнопку
вызывается обработчик события OnClick - Button1Click. Перед этим в TEdit нужно ввести
адрес URL.
НЕ ЗАБУДЬТЕ ПОМЕСТИТЬ В ФОРМУ КОМПОНЕНТ TNMHTTP! }
procedure Button1Click(Sender: TObject);
begin
{Пытаемя получить заголовок}
NMHTTP1.Head(Edit1.Text);
{Если URL неверный, то здесь выскочит ошибка}
end;

Далее - скачивание указанной странички в указанный файл.
Пример 2. Скачивание указанной URL в заданный файл

{... Здесь идет заголовок файла и определение формы TForm1 и ее экземпляра Form1}

{В форму нужно поместить кнопку TButton и три поля TEdit. При нажатии на кнопку
вызывается обработчик события OnClick - Button1Click. Перед этим в первый TEdit
нужно ввести адрес URL, во второй - имя файла для заголовка, а в третий - имя
файла для тела странички (html).
НЕ ЗАБУДЬТЕ ПОМЕСТИТЬ В ФОРМУ КОМПОНЕНТ TNMHTTP!}
procedure Button1Click(Sender: TObject);
begin
{Пытаемся получить http-документ}
{Результат надо записать в файлы}
NMHTTP1.InputFileMode := True;
{А здесь указываем в какие именно файлы}
NMHTTP1.Header := Edit2.Text;
NMHTTP1.Body := Edit3.Text;
NMHTTP1.Get(Edit1.Text);
end;

Следующий пример - скачивание сразу нескольких URL одновременно. Надо заметить, что многие программисты пренебрегают многозадачностью Windows (неважно, как она реализована, речь сейчас не об этом). В Дельфи очень легко создавать отдельные, подчиненные Вашей программе процессы (а точнее - потоки) с помощью базового класса TThread. Но об этом мы поговорим в другой раз (в другой статье).
Пример 3. Одновременное скачивание указанных URL в заданный каталог

{... Здесь идет заголовок файла и определение формы TForm1 и ее экземпляра Form1}

{Описание класса отдельного процесса}
type
THTTPThread = class(TThread)
private
{Для каждого процесса - создаем свой компонент TNMHTTP}
FHTTP: TNMHTTP;
protected
{Execute вызывается при запуске процесса; override - заменяем существующую
процедуру базового класса TThread}
procedure Execute; override;
{DoWork - созданная нами функция, выполнение которой синхронизируется в Execute}
procedure DoWork;
public
{URL - созданная нами строка, указывающая процессу, какой URL ему нужно скачать}
URL: string;
end;

{ В форму нужно поместить три кнопки TButton, одно поле TEdit и один список TListBox.
При нажатии на кнопку Button1 вызывается обработчик события OnClick - Button1Click.
Перед этим в TEdit нужно ввести путь к каталогу, в котором будут храниться скачанные
файлы, а ListBox1 нужно заполнить списком URL-ов для скачивания (с помощью кнопок
Add (Button2) и Delete (Button3)). }
procedure TForm1.Button3Click(Sender: TObject);
begin
{Удаление выделенного URL из списка}
if ListBox1.ItemIndex >= 0 then
ListBox1.Items.Delete(ListBox1.ItemIndex);
end;

procedure TForm1.Button2Click(Sender: TObject);
var s: string;
begin
{Добавление URL в список}
s := InputBox('Добавить','Введите URL:','');
if s <> '' then
ListBox1.Items.Add(s);
end;

procedure TForm1.Button1Click(Sender: TObject);
var i: Integer;
begin
{Проверка на существование каталога}
if Length(Edit1.Text) > 0 then
if not DirectoryExists(Edit1.Text) then
MkDir(Edit1.Text);
{Далее идет создание для каждого URL в списке своего процесса}
for i := 0 to ListBox1.Items.Count-1 do begin
with THTTPThread.Create(True) do begin
{Создаем приостановленную задачу, указываем ей ее URL и запускаем ее}
URL := ListBox1.Items[i];
Resume;
end;
end;
end;

{Операторы процесса THTTPThread}

procedure THTTPThread.Execute;
begin
{Делаем так, чтобы каждый процесс выполнялся одновременно с другими (синхронизация)}
Synchronize(DoWork);
end;

procedure THTTPThread.DoWork;
var i: Integer;
begin
{Создаем компонент TNMHTTP}
FHTTP := TNMHTTP.Create(Form1);
{Результат надо записывать в файлы}
FHTTP.InputFileMode := True;
{Подбираем имена для файлов}
i := 1;
while FileExists(Form1.Edit1.Text+'\page'+IntToStr(i)+'.htm') do
Inc(i);
{Указываем, в какие именно файлы класть результат}
FHTTP.Body := Form1.Edit1.Text+'\body'+IntToStr(i)+'.htm';
FHTTP.Header := Form1.Edit1.Text+'\header'+IntToStr(i)+'.txt';
{Пытаемся послать запрос}
FHTTP.Get(URL);
{Перед завершением процесса не забываем освободить память из-под компонента}
FHTTP.Free;
end;

ПРИМЕЧАНИЕ: Чтобы завершить некоторый процесс (Thread), нужно вызвать метод Terminate класса этого процесса. Приостановить процесс можно оператором Suspend, а продолжить выполнение - Resume. Также можно настроить приоритет каждого отдельного процесса через свойство Priority.

Неплохой пример работы с процессами можно найти в подпапке Demos\Threads папки, куда Вы установили Delphi.
Замечания по алгоритмам типовых задач

Если Вы собираетесь создать скачивалку сайтов, то Вам необходимо учитывать следующее (решить следующие проблемы):

Нужно скачивать не только саму страничку в формате HTML, но и все входящие в нее рисунки (gif, jpg, и т.д.);
в некоторых случаях удобно скачивать не одну страничку, а несколько страниц, ссылки на которые находятся на первой из скачиваемых страничек. При этом нужно учитывать, что на страничке могут находиться и ссылки на другие сайты, поэтому необходимо анализировать скачиваемые ссылки (чтобы случайно не скачать весь Интернет). Для решения задачи со скачиванием нескольких страничек нужно использовать рекурсию;
необходимо качественно информировать пользователя о ходе закачки. Т.е. показывать общее и скачанное количество информации;
после скачивания нужно заменить Интернетовские ссылки на локальные, чтобы можно было просматривать странички в режиме offline.

Эпилог

В этой статье отображены основные приемы работы с компонентом TNMHTTP в Дельфи. Если у Вас есть вопросы - скидывайте их мне на E-mail: snick@mailru.com , а еще лучше - пишите в конференции этого сайта (Delphi. Общие вопросы), чтобы и другие пользователи смогли увидеть Ваш вопрос и попытаться на него ответить!

Замечу, что TNMHTTP - не единственный компонент, релизующий доступ по протоколу HTTP. Есть и его аналоги с более расширенными возможностями, например, набор компонентов ICS (Internet Component Suite), в состав которого входит даже компонент FTPServer, позволяющий легко запрограммировать свой собственный сервер FTP для Windows. Этот набор можно скачать на сайте Delphi Super Page.

Карих Николай. Московская область, г.Жуковский


 
AlexДата: Вторник, 21.08.2012, 08:02 | Сообщение # 3
Генерал-полковник
Группа: Администраторы
Сообщений: 1088
Репутация: 1
Статус: Offline
Если ваша программа содержит подключаемые модули (BPL или DLL) или есть необходимость обновлять саму программу, то наверняка стояла проблема обновления копий программы. С развитием Internet появилась прекрасная возможность сделать это быстро и красиво. В данной статье мы расскажем, как добавить опцию автообновления программ из Internet.

Delphi дает нам полный доступ к API WinInet (wininet.pas), что позволяет подключиться и скачать любой файл с указанного вебсайта, используя протоколы FTP или HTTP. Например, мы можем использовать функции API WinInet для создания FTP-браузера или программы для поиска на публичных FTP-серверах заданных файлов.

Основная функция нашей программы - GetInetFile:
Code
uses Wininet;  

function GetInetFile(const fileURL, FileName: String): boolean;
const BufferSize = 1024;
var hSession, hURL: HInternet;
Buffer: array[1..BufferSize] of Byte;
BufferLen: DWORD;
f: File;
sAppName: string;
begin
    Result:=False;
    sAppName := ExtractFileName(Application.ExeName);
    hSession := InternetOpen(PChar(sAppName), INTERNET_OPEN_TYPE_PRECONFIG,
          nil, nil, 0);
    try
       hURL := InternetOpenURL(hSession,
       PChar(fileURL),nil,0,0,0);
       try
          AssignFile(f, FileName);
          Rewrite(f,1);
          repeat
             InternetReadFile(hURL, @Buffer, SizeOf(Buffer), BufferLen);
             BlockWrite(f, Buffer, BufferLen)
          until BufferLen = 0;
          CloseFile(f);
          Result:=True;
       finally
       InternetCloseHandle(hURL)
       end
    finally
    InternetCloseHandle(hSession)
    end
end;

Замечание: конечно, этот пример нужно расширить, вставив, например, код для отображения прогресса скачивания в цикл.

Использовать функцию GetInetFile очень просто:
Code
var FileOnNet, LocalFileName: string
begin
    FileOnNet:='http://www.codenet.ru/export/forum.xml';
    LocalFileName:='codenet.xml';  

    if GetInetFile(FileOnNet,LocalFileName)=True then
       ShowMessage('Download successful')
    else
       ShowMessage('Error in file download')  

end;

Этот кусок кода скачивает файл с http://www.codenet.ru/export/forum.xml и записывает его в текущий каталог под именем 'codenet.xml'. Все очень просто.


 
AlexДата: Вторник, 21.08.2012, 08:04 | Сообщение # 4
Генерал-полковник
Группа: Администраторы
Сообщений: 1088
Репутация: 1
Статус: Offline
Доступно только для пользователей
http://www.codenet.ru


 
Форум » Информационный центр » Программирование в Delphi 7 » Загрузить файл по HTTP
  • Страница 1 из 1
  • 1
Поиск: