Delphi предоставляет нам полный доступ к WinInet API (wininet.pas), который можно использовать для соединения и получения файлов с веб-сайта, который использует либо Hypertext Transfer Protocol (HTTP) либо File Transfer Protocol (FTP). Например, мы можем использовать функции из WinInet API для: добавления FTP браузера в любое приложение, создания приложения, которое автоматически скачивает файлы с общедоступных FTP серверов или поиска Internet сайтов, ссылающихся на графику и скачивать только графику.
Функция 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 можно использовать следующий код:
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'. Как перед скачиванием узнать размер файла? GetUrlInfo(HTTP_QUERY_CONTENT_LENGTH, 'http://some.com/some.zip');
function GetUrlInfo(const dwInfoLevel: DWORD; const FileURL: string): string; var hSession, hFile: hInternet; dwBuffer: Pointer; dwBufferLen, dwIndex: DWORD; begin Result := ''; hSession := InternetOpen('STEROID Download', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0); if Assigned(hSession) then begin hFile := InternetOpenURL(hSession, PChar(FileURL), nil, 0, INTERNET_FLAG_RELOAD, 0); dwIndex := 0; dwBufferLen := 20; if HttpQueryInfo(hFile, dwInfoLevel, @dwBuffer, dwBufferLen, dwIndex) then Result := PChar(@dwBuffer); if Assigned(hFile) then InternetCloseHandle(hFile); InternetCloseHandle(hsession); end; end; Источник: http://softnewsportal.ru/forum/showthread.php?p=4600 |