InternetOpenUrl
Чтение файла с данным URL должно начаться с этой функции.InternetOpenUrl( HINT:hInternet; lpszUrl:PChar; lpszHeaders:PChar; dwHeadersLength:Cardinal; dwFlags:Cardinal; dwContext:PCardinal ):hInternet;
Параметры
hInternet HINT- описатель интернет сессии, полученный вызовом функции InternetOpen lpszUrl Указатель на строку, содержащую URL файла. Поддерживаются URL начинающиеся с ftp:, gopher:, http:, или https: lpszHeaders Указатель на строку, содержащую заголовок запроса HTTP. dwHeadersLength Длина строки заголовка. Если значение этого параметра -1, то длина вычисляется автоматически dwFlags Дополнительные параметры. Вы можете использовать следующие флаги:INTERNET_FLAG_EXISTING_CONNECT |
INTERNET_FLAG_HYPERLINK |
INTERNET_FLAG_IGNORE_CERT_CN_INVALID |
INTERNET_FLAG_IGNORE_CERT_DATE_INVALID |
INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP |
INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTPS |
INTERNET_FLAG_KEEP_CONNECTION |
INTERNET_FLAG_NEED_FILE |
INTERNET_FLAG_NO_AUTH |
INTERNET_FLAG_NO_AUTO_REDIRECT |
INTERNET_FLAG_NO_CACHE_WRITE |
INTERNET_FLAG_NO_COOKIES |
INTERNET_FLAG_NO_UI |
INTERNET_FLAG_PASSIVE |
INTERNET_FLAG_PRAGMA_NOCACHE |
INTERNET_FLAG_RAW_DATA |
INTERNET_FLAG_RELOAD |
INTERNET_FLAG_RESYNCHRONIZE |
INTERNET_FLAG_SECURE |
InternetReadFile
Чтение информации из описателя, полученного от функций InternetOpenUrl, FtpOpenFile, GopherOpenFile, или HttpOpenRequest.InternetReadFile( hFile:hInternet; lpBuffer:Pointer; dwNumberOfBytesToRead:Cardinal; lpdwNumberOfBytesRead:Cardinal ):BOOLEAN;
Параметры
hFile hFile- описатель файла, полученный от вызова InternetOpenUrl, FtpOpenFile, GopherOpenFile, или HttpOpenRequest lpBuffer Адрес буфера, в который записываются полученные данные dwNumberOfBytesToRead Количество байт, которые следует прочитать lpdwNumberOfBytesRead Количество реально прочитанных байт. Это значение будет установлено в 0 перед работой, или проверкой ошибок Возвращает TRUE при успешном завершении и FALSE в противном случае. Информация об ошибках передачи может быть получена от InternetGetLastResponseInfoЗамечания
Если значение функции TRUE и количество прочитанных байт 0, то передача файла успешно завершена(достигнут конец файла)InternetSetFilePointer
Устанавливает точку чтения для InternetReadFile. Возможно, сервер не поддерживает возможность.InternetSetFilePointer( hFile:hInternet; lDistanceToMove:Integer; pReserved:Pointer; dwMoveMethod:Cardinal; dwContext:Cardinal ):Integer;
Параметры
hFile Описатель файла, полученный от вызова InternetOpenUrl (для HTTP,или HTTPS URL) или HttpOpenRequest (метод GET или HEAD). Описатель не должен быть создан со флагом INTERNET_FLAG_DONT_CACHE или INTERNET_FLAG_NO_CACHE_WRITE lDistanceToMove Значение, содержащее число байтов для передвижения файлового указателя. Положительное число означает передвижение вперед, отрицательное- назад. pReserved Зарезвировано. Установите в nil dwMoveMethod Параметр, указывающий способ перемещения. Возможно одно из следующих значений:FILE_BEGIN | Начальная точка- начало файла. Если установлен FILE_BEGIN, то lDistanceToMove интерпретируется, как положение новой точки чтения от начала. |
FILE_CURRENT | Текущая точка чтения- точка начала. |
FILE_END | Начальная точка- конец файла. Если размер файла не известен, то метод не работает |
Замечания
Функция не может быть использована, если достигнут конец файла функцией InternetReadFile. Правильная работа функции не гарантирована, если размер файла не может быть определен. Для нас эта функция нужна, чтобы использовать возможность возобновления скачивания файлов.Для получения текста ошибки будем использовать следующую функцию:
Function GetErrorText(const FromServer:BOOLEAN):String;
Var Msg:Array[0..1023]of Char;
ErCode,Len:Cardinal;
begin
Len:=1023;
ZeroMemory(@Msg,SizeOf(Msg));
if FromServer
then
if InternetGetLastResponseInfo(ErCode,@Msg,Len)
then Result:='На сервере произошла ошибка #'+IntToStr(ErCode)+#13''''+StrPas(@msg)+''''
else Result:='Не могу получить описание ошибки'
else
if FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,
nil,GetLastError,
GetKeyboardLayout(0),
@Msg,1023,nil)<>0
then Result:=StrPas(@Msg)
else Result:='Не могу получить описание ошибки';
end;
Если параметр FromServer TRUE, то код ошибки и её текст берется с сервера, в противном случае берется текст локальной ошибки.
А теперь простейший пример закачки файла с сервера По кнопке Button1 происходит закачка. В Edit1 содержится URL файла без префикса http://
procedure TForm1.Button1Click(Sender: TObject);
Вот, собственно, и все. Желаю удачи!
Var
Session,URL: hInternet;
F: TFileStream;
Q,Fail:BOOLEAN;
Buf:Array[1..8192]of Byte;
R:Cardinal;
begin
Fail:=FALSE;
if SaveDialog1.Execute
then
begin
F:=TFileStream.Create(SaveDialog1.FileName,fmCreate);
Session:=InternetOpen('IExplorer',INTERNET_OPEN_TYPE_PRECONFIG,nil,nil,0);
if Session=nil
then begin
MessageDlg('Error, InternetOpen: Соединение не может быть установлено',
mtError,[mbOK],0);
exit;
end;
URL:=InternetOpenURL(Session,PChar('http://'+Edit1.Text),nil,0,0,0);
if URL=nil
then
begin
MessageDlg('Error, InternetOpenURL: Ссылка не может быть открыта!',
mtError,[mbOK],0);
InternetCloseHandle(Session);
exit;
end;
R:=0;
try
Repeat
Q:=InternetReadFile(URL,@Buf,8192,R);
F.Write(Buf,R);
until Q and(R=0)
except
MessageDlg('Error, не могу прочитать файл.'#13+GetErrorText(TRUE),
mtError,[mbOK],0);
InternetCloseHandle(Session);
InternetCloseHandle(URL);
Fail:=TRUE;
end;
if not Fail
then ShowMessage('Файл успешно скачен.');
InternetCloseHandle(URL);
InternetCloseHandle(Session);
F.Free;
end;
end;