Как загрузить файл с успехом с помощью IdHTTP через https

Я пытаюсь загрузить файл с помощью indy10 http-компонентов TIdHttp при получении прогресса, я только что установил библиотеки в папке приложения, используя код для http-URL, который он работает, и прогресс, но с https он просто ничего не делает и он не вызывает никаких исключений:/

with TIdHTTP.Create(nil) do
 begin
 IOHndl:=TIdSSLIOHandlerSocketOpenSSL.Create(nil);
 Request.BasicAuthentication:=True;
 HandleRedirects:=True;
 IOHandler:=IOHndl;
 OnWork:=FOnWork;
 OnWorkBegin:=FOnWorkBegin;
 OnWorkEnd:=FOnWorkEnd;
 Get(FUrl,FStream);
end;

С наилучшими пожеланиями

1 ответ

Сначала вам нужно создать небольшой класс для переноса HTTP-компонента:

unit IdHTTPProgressU;
interface
uses
 Classes, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP, IdSSLOpenSSL;
{$M+}
type
 TIdHTTPProgress = class(TIdHTTP)
 private
 FProgress: Integer;
 FBytesToTransfer: Int64;
 FOnChange: TNotifyEvent;
 IOHndl: TIdSSLIOHandlerSocketOpenSSL;
 procedure HTTPWorkBegin(ASender: TObject; AWorkMode: TWorkMode; AWorkCountMax: Int64);
 procedure HTTPWork(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Int64);
 procedure HTTPWorkEnd(Sender: TObject; AWorkMode: TWorkMode);
 procedure SetProgress(const Value: Integer);
 procedure SetOnChange(const Value: TNotifyEvent);
 public
 Constructor Create(AOwner: TComponent);
 procedure DownloadFile(const aFileUrl: string; const aDestinationFile: String);
 published
 property Progress: Integer read FProgress write SetProgress;
 property BytesToTransfer: Int64 read FBytesToTransfer;
 property OnChange: TNotifyEvent read FOnChange write SetOnChange;
 end;
implementation
uses
 Sysutils;
{ TIdHTTPProgress }
constructor TIdHTTPProgress.Create(AOwner: TComponent);
begin
 inherited;
 IOHndl := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
 Request.BasicAuthentication := True;
 HandleRedirects := True;
 IOHandler := IOHndl;
 ReadTimeout := 30000;
 OnWork := HTTPWork;
 OnWorkBegin := HTTPWorkBegin;
 OnWorkEnd := HTTPWorkEnd;
end;
procedure TIdHTTPProgress.DownloadFile(const aFileUrl: string; const aDestinationFile: String);
var
 LDestStream: TFileStream;
 aPath: String;
begin
 Progress := 0;
 FBytesToTransfer := 0;
 aPath := ExtractFilePath(aDestinationFile);
 if aPath <> '' then
 ForceDirectories(aPath);
 LDestStream := TFileStream.Create(aDestinationFile, fmCreate);
 try
 Get(aFileUrl, LDestStream);
 finally
 FreeAndNil(LDestStream);
 end;
end;
procedure TIdHTTPProgress.HTTPWork(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Int64);
begin
 if BytesToTransfer = 0 then // No Update File
 Exit;
 Progress := Round((AWorkCount / BytesToTransfer) * 100);
end;
procedure TIdHTTPProgress.HTTPWorkBegin(ASender: TObject; AWorkMode: TWorkMode; AWorkCountMax: Int64);
begin
 FBytesToTransfer := AWorkCountMax;
end;
procedure TIdHTTPProgress.HTTPWorkEnd(Sender: TObject; AWorkMode: TWorkMode);
begin
 FBytesToTransfer := 0;
 Progress := 100;
end;
procedure TIdHTTPProgress.SetOnChance(const Value: TNotifyEvent);
begin
 FOnChance := Value;
end;
procedure TIdHTTPProgress.SetProgress(const Value: Integer);
begin
 FProgress := Value;
 if Assigned(FOnChance) then
 FOnChance(Self);
end;
end.

Я не буду вдаваться в подробности с помощью calss: просто скажите, что он bacally обертывает компонент TIdhttp и назначает 3 события: OnBegin, onWork и OnEnd

Метод DownloadFile действительно загружает,

Затем, когда вы должны использовать его, вы можете сделать следующее: Поместите кнопку и PrograssBar в пустой форме. Добавьте IdHTTPProgressU в список использования.

Объявите vaiable TIdHTTPProgress и локальный onChangeEvent

Ваше определение формы должно выглядеть следующим образом:

type
 TForm1 = class(TForm)
 Button1: TButton;
 ProgressBar1: TProgressBar;
 procedure FormCreate(Sender: TObject);
 procedure Button1Click(Sender: TObject);
 private
 procedure IdHTTPProgressOnChange(Sender : TObject);
 public
 IdHTTPProgress: TIdHTTPProgress;
 end;

Затем вам просто нужно реализовать методы:

{ TForm1 }
 procedure TForm1.Button1Click(Sender: TObject);
 begin
 IdHTTPProgress.OnChange := IdHTTPProgressOnChance;
 IdHTTPProgress.OnChance := IdHTTPProgressOnChance;
 IdHTTPProgress.DownloadFile('https://wordpress.org/latest.zip', 'latest.zip');
 end;
 procedure TForm1.FormCreate(Sender: TObject);
 begin
 IdHTTPProgress := TIdHTTPProgress.Create(Self);
 end;
 procedure TForm1.IdHTTPProgressOnChance(Sender: TObject);
 begin
 ProgressBar1.Position := TIdHTTPProgress(Sender).Progress;
 Application.ProcessMessages;
 end;

Вот об этом. Дайте это при попытке.

licensed under cc by-sa 3.0 with attribution.