idHTTP, Czy serwer odpowiada

0

Muszę sprawdzić przy pobieraniu pliku:

  • czy serwer jest aktywny
  • czy plik na serwerze aktywnym istnieje

W przypadku, gdy serwer nie odpowiada lub plik nie istnieje na serwerze, ściąga mi się pusty plik "instalator.exe".

type
  TPobieraniePliku = class(TThread)
   protected
    procedure Execute; override;
  end;

var
  Form1: TForm1;
  PobieraniePliku: TPobieraniePliku;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
 Label1.Caption  := 'Rozpoczynanie...';
 PobieraniePliku := TPobieraniePliku.Create(True);
 PobieraniePliku.Resume;
end;

procedure TPobieraniePliku.Execute;
var
 DownLoadFile: TFileStream;
begin
 DownLoadFile := TFileStream.Create(ExtractFilePath(Application.Exename) + 'instalator.exe',fmCreate);
 Form1.IdHTTP1.Get(Form1.Edit1.Text,DownLoadFile);
 DownLoadFile.Free;

 {Zakończenie wątku}
 PobieraniePliku.Terminate;
end;

procedure TForm1.IdHTTP1WorkBegin(ASender: TObject; AWorkMode: TWorkMode;
  AWorkCountMax: Integer);
begin
 if AWorkMode = wmRead then
   begin
    ProgressBar1.Max      := AWorkCountMax;
    ProgressBar1.Position := 0;
   end;
end;

procedure TForm1.IdHTTP1WorkEnd(ASender: TObject; AWorkMode: TWorkMode);
begin
 if AWorkMode = wmRead then Label1.Caption := 'Pobrano !';
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 IdHTTP1.Disconnect;
end;

procedure TForm1.IdHTTP1Work(ASender: TObject; AWorkMode: TWorkMode;
  AWorkCount: Integer);
begin
 if AWorkMode = wmRead then
   begin
    ProgressBar1.Position := AWorkCount;
    Label1.Caption := 'Pobrano: ' + FloatToStrf(AWorkCount / 1024,ffFixed,100,0) + ' kB z: ' + FloatToStrf(ProgressBar1.Max / 1024,ffFixed,100,0) + ' kB';
   end;
end;

Próbowałem w ten sposób:

procedure TPobieraniePliku.Execute;
var
 DownLoadFile: TFileStream;
begin
    {Pobranie pliku}
    Form1.IdHTTP1.Head(Form1.Edit1.Text);
    if Form1.IdHTTP1.Response.ContentLength > 0 then 
      try
       DownLoadFile := TFileStream.Create(ExtractFilePath(Application.Exename) + 'instalator.exe',fmCreate);
       Form1.IdHTTP1.Get(Form1.Edit1.Text,DownLoadFile);
       DownLoadFile.Free;
     except
        on E: EIdException do
         begin
           //DownLoadFile.Free;  <<<<<< tutaj chyba powinienem zwolnić zmienną w wyniku błędu ?
          FormUpdate.Label1.Caption := 'Serwer zgłasza błąd "' + E.Message + '"';
         end;
     end;

 {Zakończenie wątku}
 PobieraniePliku.Terminate;
end;

Ale wątek nie wykonuje się i plik nie jest pobierany. Jak można to poprawić ?

0

jest tu gdzieś w FAQ czy gotowcach temacik "jak sprawdzić cy plik znajduje się na serwerze"
może tam będzie =] ( o ile tamto nie jest od FTP )

0

Jeżeli może być bez Indy, to ja kiedyś pisząć prosty konsolowy program, który pobietał aktuelne IP
użytkownika ze strony no-ip.com i wklejał je do Schowka, uzyłem poniższej funkcji do sprawdzenia
czy podany adres jest prawidłowy. Może Tobie się przyda. Tylko zrób sobie formatowanie kodu:

uses WinInet;

function CheckUrl(Url : string) : boolean;
var
hSession, hfile : hInternet;
dwindex, dwcodelen : integer;
dwcode : array[1..20] of Char;
Res : PChar;
begin
if Pos('http://', url) = 0 then
Url := 'http://' + Url;
Result := false;
hSession := InternetOpen('InetURL:/1.0',INTERNET_OPEN_TYPE_PRECONFIG,nil, nil, 0);
if Assigned(hsession) then
begin
hfile := InternetOpenUrl( hsession, pchar(url), nil, 0, INTERNET_FLAG_RELOAD, 0);
dwIndex := 0;
dwCodeLen := 10;
HttpQueryInfo(hfile, HTTP_QUERY_STATUS_CODE, @dwcode, dwcodeLen, dwIndex);
Res := PChar(@dwcode);
Result := (Res = '200') or (Res = '302');
if Assigned(hfile) then InternetCloseHandle(hfile);
InternetCloseHandle(hsession);
end;
end;
0

Pobieranie za pomocą WinInet, całkowicie odpada, gdyż nie obsługuje Proxy.
W grę wchodzi tylko Indy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1