Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Загрузка файла по HTTP [D7, 95/98, XP]


KVV ©   (2008-06-24 19:46:00) 

Код взял где-то на форуме.


function GetInetFile(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;
 hSession:=InternetOpen(PChar('IE'),INTERNET_OPEN_TYPE_PRECONFIG,nil,nil,0);
 if hSession=nil then //Msg
 else try
   hURL:=InternetOpenURL(hSession,PChar(fileURL),nil,0,0,0);
   if hURL=nil then //Msg
   else 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;

function CheckInetUrlExist(url: string): boolean;
var
 hNet: HINTERNET;
 hUrl: HINTERNET;
begin
 Result := False;
 hNet:=InternetOpen(PChar('IE'),INTERNET_OPEN_TYPE_PRECONFIG,nil,nil,0);
 if hNet=nil then //Msg
 else try
   hUrl:=InternetOpenUrl(hNet,PChar(Url),nil,0,INTERNET_FLAG_RELOAD,0);
   if hUrl=nil then //Msg
   else try
     Result:=Assigned(hUrl);
   finally InternetCloseHandle(hUrl); end;
 finally InternetCloseHandle(hNet); end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 Button1.Enabled:=False; try
   If CheckInetUrlExist(' http://www.nalog.ru/index.html')
   then GetInetFile(' http://www.nalog.ru/index.html',
     'f:\!_Delme\index.html'
   );
 finally Button1.Enabled:=True; end;
end;


Есть несколько вопросов:
1. Если интернет не подключен, программа виснет на команде "InternetOpenURL" (только в XP), в Win98 выдается окно "Подключение удаленного доступа" (или что-то в этом роде) - отменяешь и все - программа завершается без загрузки.
2. Пару раз в XP зависание было и при подключенном интернете.

Можно ли каким-либо образом узнать, что интернет не подключен прежде, чем вызывать InternetOpenURL?
Или что-то нужно делать по-другому?

3. Если файла на сайте нет, возвращается HTML-код с сообщением об ошибке (т.е. файл-результат есть, но содержит HTML-код).

Можно ли узнать, что файла нет, не обрабатывая этот HTML-код.

4. Где-то на форуме видел другие варианты загрузки.
В них вместо "InternetOpenURL" использовались "InternetConnect",
"HTTPopenRequest", "HTTPsendRequest", "InternetQueryDataAvailable".
Что правильнее?


KVV   (2008-06-24 21:18:00) [1]

IdHTTP - это то, что в п.4 или что-то другое?
(Только чур сильно не пинать за вопрос)


Palladin   (2008-06-24 20:49:00) [2]

WinInet, штука тонкая. А все это ты реализуешь именно через него. Думаю в твоем случае, все'же, лучше будет отработать через IdHTTP.


Наверх

Титульная страница Поиск, карта сайта Написать письмо