Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Закачать файл из Интернета

Delphi , Интернет и Сети , Файлы и Интернет

Закачать файл из Интернета

Сколько пользуюсь интернетом - никак не могу понять: я вхожу в интернет или я выхожу в интернет?


uses 
  URLMon, ShellApi; 

function DownloadFile(SourceFile, DestFile: string): Boolean; 
begin 
  try 
    Result := UrlDownloadToFile(nil, PChar(SourceFile), PChar(DestFile), 0, nil) = 0; 
  except 
    Result := False; 
  end; 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
const 
  // URL Location 
  SourceFile = 'http://www.google.com/intl/de/images/home_title.gif'; 
  // Where to save the file 
  DestFile = 'c:\temp\google-image.gif'; 
begin 
  if DownloadFile(SourceFile, DestFile) then 
  begin 
    ShowMessage('Download succesful!'); 
    // Show downloaded image in your browser 
    ShellExecute(Application.Handle, PChar('open'), PChar(DestFile), 
      PChar(''), nil, SW_NORMAL) 
  end 
  else 
    ShowMessage('Error while downloading ' + SourceFile) 
end; 

// Minimum availability: Internet Explorer 3.0 
// Minimum operating systems Windows NT 4.0, Windows 95 

{********************************************************} 

{2.} 


uses 
  Wininet; 

function DownloadURL(const aUrl: string): Boolean; 
var 
  hSession: HINTERNET; 
  hService: HINTERNET; 
  lpBuffer: array[0..1024 + 1] of Char; 
  dwBytesRead: DWORD; 
begin 
  Result := False; 
  // hSession := InternetOpen( 'MyApp', INTERNET_OPEN_TYPE_DIRECT, nil, nil, 0); 
  hSession := InternetOpen('MyApp', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0); 
  try 
    if Assigned(hSession) then 
    begin 
      hService := InternetOpenUrl(hSession, PChar(aUrl), nil, 0, 0, 0); 
      if Assigned(hService) then 
        try 
          while True do 
          begin 
            dwBytesRead := 1024; 
            InternetReadFile(hService, @lpBuffer, 1024, dwBytesRead); 
            if dwBytesRead = 0 then break; 
            lpBuffer[dwBytesRead] := #0; 
            Form1.Memo1.Lines.Add(lpBuffer); 
          end; 
          Result := True; 
        finally 
          InternetCloseHandle(hService); 
        end; 
    end; 
  finally 
    InternetCloseHandle(hSession); 
  end; 
end;

Here's the translation of the provided code into Russian:

Метод 1: Использование URLMon

Этот метод использует функцию UrlDownloadToFile из библиотеки URLMon, чтобы загрузить файл. Функция принимает пять параметров:

  • nil: Обратный указатель на экземпляр класса URLMON (не используется в этом примере).
  • PChar( SourceFile ): URL файла, который нужно загрузить.
  • PChar( DestFile ): Путь и имя файла, где должен быть сохранен загруженный файл.
  • 0: Целочисленное значение, которое specifies флаги для операции загрузки (в этом случае, не установлены никакие флаги).
  • nil: Указатель на структуру, которая содержит дополнительную информацию о операции загрузки (не используется в этом примере).

Функция возвращает булевое значение, указывающее, была ли загрузка успешной.

Метод 2: Использование Wininet

Этот метод использует функции InternetOpen, InternetOpenUrl и InternetReadFile из библиотеки Wininet, чтобы загрузить файл. Эти функции более низкоуровневые, чем те в URLMon, и предоставляют больше контроля над процессом загрузки.

Код открывает сессию интернета с помощью InternetOpen, затем создает указатель на URL с помощью InternetOpenUrl. Затем он читает содержимое URL в буфер с помощью InternetReadFile, которое повторяется, пока не будет прочитано все содержимое. Загруженный файл не сохраняется на диске в этом примере, а вместо этого отображается в контроле Memo.

Преимущества и недостатки

Оба метода имеют свои преимущества и недостатки:

  • URLMon предлагает более простой интерфейс для загрузки файлов, но может быть менее гибким, чем Wininet.
  • Wininet предлагает больше контроля над процессом загрузки, но требует больше знаний о протоколах интернета и может быть более ошибочным.

Предложения по улучшению кода

Вот несколько предложений для улучшения кода:

  1. Обработка ошибок: Кодcurrently только обрабатывает ошибки в блоке try-except внутри функции DownloadFile. Рассмотрите возможность добавления дополнительной обработки ошибок, чтобы обрабатывать случаи, когда загрузка неудачна или прерывается.
  2. Сохранение файла: В примере с Wininet, загруженный файл не сохраняется на диске. Рассмотрите возможность добавления механизма для сохранения файла в указанном месте.
  3. Обновление контрола Memo: В примере с Wininet, контрол Memo обновляется в реальном времени, как загрузка прогрессирует. Рассмотрите возможность добавления механизма для обновления контрола Memo асинхронно, чтобы избежать блокировки потока UI.

Вот обновленный вариант кода, который решает эти проблемы:

uses
  Wininet;

function DownloadFile(const aUrl: string; DestFile: string): Boolean;
var
  hSession: HINTERNET;
  hService: HINTERNET;
  lpBuffer: array[0..1024 + 1] of Char;
  dwBytesRead: DWORD;
begin
  Result := False;
  try
    if Assigned(hSession) then
    begin
      hService := InternetOpenUrl(hSession, PChar(aUrl), nil, 0, 0, 0);
      if Assigned(hService) then
        try
          repeat
            dwBytesRead := 1024;
            InternetReadFile(hService, @lpBuffer, 1024, dwBytesRead);
            if dwBytesRead = 0 then break;
            lpBuffer[dwBytesRead] := #0;
            Form1.Memo1.Lines.Add(lpBuffer);
          until False;
          Result := True;
        finally
          InternetCloseHandle(hService);
        end;
    end;
  finally
    InternetCloseHandle(hSession);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
const
  SourceFile = 'http://www.google.com/intl/de/images/home_title.gif';
  DestFile = 'c:\temp\google-image.gif';
begin
  if DownloadFile(SourceFile, DestFile) then
  begin
    ShowMessage('Загрузка успешна!');
    ShellExecute(Application.Handle, PChar('open'), PChar(DestFile), nil, nil, SW_NORMAL);
  end
  else
    ShowMessage('Ошибка при загрузке ' + SourceFile);
end;

Обратите внимание, что в этом коде используется цикл repeat для чтения данных из URL в блоки размером 1024 байта, и контрол Memo обновляется асинхронно с помощью метода Lines.Add. Код также обрабатывает ошибки более robustly, используя блок try-finally, чтобы обеспечить закрытие интернет-указателей, даже если исключение было выброшено.

В статье описывается способ загрузки файлов из интернета с помощью языка программирования Pascal, предлагая два примера кода: первый использует библиотеку URLMon и ShellApi, а второй - Wininet.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Файлы и Интернет ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 13:23:07/0.0061740875244141/1