На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Rouse_, jack128, Krid
  
    > Скачивание файла по HTTP , средствами WinAPI
      (Перевод одноимённой статьи с сайта delphi.about.com )

      Обычно при разработке приложений, которые планируется в дальнейшем обновлять и усовершенствовать, основные модули хранятся в виде пакетов (Package) или библиотек DLL. В настоящее время Internet предоставляет возможность без особых усилий осуществлять обновление этих модулей. Поэтому добавление к Вашему приложению функции авто-обновления, является наилучшим способом для обновления приложения.

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

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

      ExpandedWrap disabled
        Функция GetInetFile
         
        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;


      Обратите внимание: Чтобы обеспечить некоторую визуальную обратную связь для пользователя, Вы можете добавить строчку наподобие FlashWindow(Application.Handle,True) в тело блока "повторить/до тех пор" (repeat/until). Вызов FlashWindow API высвечивает заголовок Вашего имени приложений в панели задач.

      Использование
      Для вызова функции GetInetFile можно использовать следующий код:


      ExpandedWrap disabled
        var FileOnNet, LocalFileName: string
        begin
         FileOnNet:='http://delphi.about.com/library/forminbpl.zip';
         LocalFileName:='File Downloaded From the Net.zip'
         if GetInetFile(FileOnNet,LocalFileName)=True then
          ShowMessage('Download successful')
         else
          ShowMessage('Error in file download')
        end;


      Данный код запрашивает файл 'forminbpl.zip' с сайта, скачивает его, и сохраняет его как 'File Downloaded From the Net.zip'.

      Обратите внимание: В зависимости от версии Delphi, Вы можете использовать различные компоненты, которые можно найти на Интернет страницах, посвещённых VCL и, которые можно использовать для упрощения создания приложений (например FTP компонент, необходимый для TNMFTP, находящийся на странице FastNet VCL).

      Добавлено в



      Как скачать любой URL используя стандартные настройки сети

      Начиная с Internet Explorer 3, Microsoft поддерживает очень полезные API, Wininet. Эти функции позволяют использовать все возможности IE, такие как настройки прокси, кэширование файлов и т.д.

      Ниже приведён пример использования этих функций для скачивания файла с нужного URL. Это может быть любой доступный URL, ftp://, http://, gopher://, и т.д.

      Более подробную информацию об этих функция можно посмотреть в MSDN - Win32 Internet API Functions.

      ExpandedWrap disabled
        function DownloadFile(const Url: string): string;
        var
          NetHandle: HINTERNET;
          UrlHandle: HINTERNET;
          Buffer: array[0..1024] of char;
          BytesRead: cardinal;
        begin
          Result := '';
          NetHandle := InternetOpen('Delphi 5.x', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
         
          if Assigned(NetHandle) then
            begin
         
            UrlHandle := InternetOpenUrl(NetHandle, PChar(Url), nil, 0, INTERNET_FLAG_RELOAD, 0);
         
            if Assigned(UrlHandle) then
              { UrlHandle правильный? Начинаем загрузку }
              begin
              FillChar(Buffer, SizeOf(Buffer), 0);
              repeat
                Result := Result + Buffer;
                FillChar(Buffer, SizeOf(Buffer), 0);
                InternetReadFile(UrlHandle, @Buffer, SizeOf(Buffer), BytesRead);
              until BytesRead = 0;
              InternetCloseHandle(UrlHandle);
              end
            else
              begin
              { UrlHandle неправильный. Генерируем исключительную ситуацию. }
              raise Exception.CreateFmt('Cannot open URL %s', [Url]);
              end;
         
            InternetCloseHandle(NetHandle);
            end
          else
            { NetHandle недопустимый. Генерируем исключительную ситуацию }
            raise Exception.Create('Unable to initialize Wininet');
        end;
        ExpandedWrap disabled
          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;
        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0,1630 ]   [ 16 queries used ]   [ Generated: 3.05.24, 13:02 GMT ]