subglobal1 link | subglobal1 link | subglobal1 link | subglobal1 link | subglobal1 link | subglobal1 link | subglobal1 link
subglobal2 link | subglobal2 link | subglobal2 link | subglobal2 link | subglobal2 link | subglobal2 link | subglobal2 link
subglobal3 link | subglobal3 link | subglobal3 link | subglobal3 link | subglobal3 link | subglobal3 link | subglobal3 link
subglobal4 link | subglobal4 link | subglobal4 link | subglobal4 link | subglobal4 link | subglobal4 link | subglobal4 link
subglobal5 link | subglobal5 link | subglobal5 link | subglobal5 link | subglobal5 link | subglobal5 link | subglobal5 link
subglobal6 link | subglobal6 link | subglobal6 link | subglobal6 link | subglobal6 link | subglobal6 link | subglobal6 link
subglobal7 link | subglobal7 link | subglobal7 link | subglobal7 link | subglobal7 link | subglobal7 link | subglobal7 link
subglobal8 link | subglobal8 link | subglobal8 link | subglobal8 link | subglobal8 link | subglobal8 link | subglobal8 link

Delphi->статьи->работа с интернет, модемом (часть 2-ая)

small logo

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
dwContext Установите в 0 Возвращает описатель для FTP, Gopher, или HTTP ссылки если все прошло успешно, или nil в противном случае Чтобы узнать, почему сервер не дал доступа, вызовите InternetGetLastResponseInfo.

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 Начальная точка- конец файла. Если размер файла не известен, то метод не работает
dwContext Зарезервировано. Установите в 0. При успешном выполнении возвращает текущую позицию(от начала) точки чтения, в противном случае возаращает -1.
Замечания
Функция не может быть использована, если достигнут конец файла функцией 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;

Вот, собственно, и все. Желаю удачи!

Вся информация на сайте является интелектуальной собственностью. Перепечатка или распространение без разрешения автора запрещена

Copiright©: GRIENDERS 2006 ака Маслаков Александр


Hosted by uCoz