Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Download aus INet - fertiger Code gesucht (https://www.delphipraxis.net/203017-download-aus-inet-fertiger-code-gesucht.html)

Redeemer 4. Jan 2020 18:01

AW: Download aus INet - fertiger Code gesucht
 
Zitat:

Zitat von Guido Eisenbeis (Beitrag 1454428)
Leider ist es mir nicht gelungen, Delphi-Code zu finden, der auch nur eine einzige Datei (ca. 5 MB) downloaded. Das Meiste ist aus den frühen 2000ern! Die Codes sind entweder nicht zum Laufen zu bringen (lassen sich nicht kompilieren, weil alles veraltet ist), oder sie laden von den 5 MB nur 40 KB runter. Aktuelle Codes scheint es nicht zu geben.

TDownloadURL gibt es beispielsweise seit ich mich erinnern kann, und der komplette Code sieht seit eher so aus:
Delphi-Quellcode:
DownloadURL1.Execute;

Ach verdammt, ich wollte ja keinen fertigen Code posten.

Dann mach ich's hier besser:
Zitat:

Zitat von Guido Eisenbeis (Beitrag 1454428)
Hast du ein Code Beispiel für TNetHTTPClient?

Delphi-Referenz durchsuchenSystem.Net.HttpClientComponent.TNetHTTPClient.Get

Guido Eisenbeis 4. Jan 2020 18:37

AW: Download aus INet - fertiger Code gesucht
 
Zitat:

Zitat von Redeemer (Beitrag 1454429)
TDownloadURL gibt es beispielsweise seit ich mich erinnern kann, ...

Das ist scheinbar das Problem, denn in Delphi 10.3 finde ich die Componente nicht.

Luckie 4. Jan 2020 19:40

AW: Download aus INet - fertiger Code gesucht
 
Google-Suche, erster Treffer: http://docs.embarcadero.com/products...wnLoadURL.html

philipp.hofmann 4. Jan 2020 21:44

AW: Download aus INet - fertiger Code gesucht
 
Die einfachste Variante, wenn man nur eine Datei herunterlädt (läuft bei mir in sowieso in einem Thread, daher geht auch die Fortschrittsanzeige und der direkte Aufruf von ohne get an TNetHTTPClient):

Delphi-Quellcode:
var httpClient: TNetHTTPClient;
    ms:TStream;
begin
  httpClient:=TNetHTTPClient.create(nil);
  try
    httpClient.OnAuthEvent:=NetHTTPClientAuthEvent;
    httpClient.OnReceiveData:=NetHTTPClientReceiveData;
    httpClient.ConnectionTimeout:=60000;
    httpClient.ProxySettings := TProxySettings.Create(xxx,yyy);
    ms:=TFileStream.Create(localFileName,fmCreate or fmOpenReadWrite);
    try
      httpClient.Get('https://'+remoteFileName,ms);
    finally
      ms.Free();
    end;
  finally
    httpClient.free();
  end;

procedure TForm.NetHTTPClientAuthEvent(const Sender: TObject; AnAuthTarget: TAuthTargetType; const ARealm, AURL: string; var AUserName, APassword: string; var AbortAuth: Boolean; var Persistence: TAuthPersistenceType);
begin
  AUserName:=xxx;
  APassword:=yyy;
end;

procedure TForm.NetHTTPClientReceiveData(const Sender: TObject; AContentLength, AReadCount: Int64; var Abort: Boolean);
begin
  //todo: Fortschrittsanzeige
end;
Ob Du ein OnAuthEvent oder ProxySettings benötigst hängt an der jeweiligen Konfiguration, wahrscheinlich eher nein und man kommt natürlich auch ohne OnReceiveData aus).

Guido Eisenbeis 5. Jan 2020 02:31

AW: Download aus INet - fertiger Code gesucht
 
@philipp.hofmann

Dein Code hat mir den Einstieg ermöglicht. Ich bin nun in der Lage, eine Datei herunterzuladen, eine Fortschrittsanzeige zu zeigen und einen laufenden Download abzubrechen.

Vielen Dank für deine Hilfe! :thumb:

KodeZwerg 7. Jan 2020 07:10

AW: Download aus INet - fertiger Code gesucht
 
Guten Morgen, folgender Kode hat mir immer brav gedient, allerdings ohne Https Unterstützung.

Delphi-Quellcode:
(*

Simples Http-Get Beispiel,
hier steht nur das dürftigste drinnen,
sollte aber dennoch recht verständlich sein.
Hierbei bleibt das Kompilat relativ schlank da alles nativ abläuft.

*)



// ************* Header

{$IFNDEF MSWindows}
{$MESSAGE ERROR 'This program/unit is made for Windows only!'}
{$ENDIF MSWindows}

{$IF CompilerVersion >= 23}
{$DEFINE NameSpace}
{$IFEND CompilerVersion}



// ************* Uses

uses
{$IFDEF NameSpace}
  Winapi.Classes,
  Winapi.WinInet;
{$ELSE NameSpace}
  Classes,
  WinInet;
{$ENDIF NameSpace}



// ************* Methode

procedure HttpGet(const Url: string; Data: TStream);
const
  BuffSize = 1024 * 1024;
var
  hInter: HINTERNET;
  UrlHandle: HINTERNET;
  BytesRead: DWORD;
  Buffer: Pointer;
begin
  hInter := InternetOpen('', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
  if Assigned(hInter) then
  begin
    Data.Seek(0, 0);
    GetMem(Buffer, BuffSize);
    try
      UrlHandle := InternetOpenUrl(hInter, PChar(Url), nil, 0, INTERNET_FLAG_RELOAD, 0);
      if Assigned(UrlHandle) then
      begin
        repeat
          InternetReadFile(UrlHandle, Buffer, BuffSize, BytesRead);
          if BytesRead > 0 then
            Data.WriteBuffer(Buffer^, BytesRead);
        until BytesRead = 0;
        InternetCloseHandle(UrlHandle);
      end;
    finally
      FreeMem(Buffer);
    end;
    InternetCloseHandle(hInter);
  end
end;



// ************* Beispiel

procedure DoJob;
var
  DataStream: TMemoryStream;
begin
  DataStream := TMemoryStream.Create;
  try
    try
      HttpGet('http://download-adresse.com/Filename.ext', DataStream);
      if DataStream.Size > 0 then
        DataStream.SaveToFile('X:\Pfad\Lokal-Filename.ext'); // oder mach halt was anderes mit dem Stream...
    except
      on E: exception do
        ShowMessage(E.Message);
    end;
  finally
    DataStream.Free;
  end;
end;

Guido Eisenbeis 7. Jan 2020 07:23

AW: Download aus INet - fertiger Code gesucht
 
Guten Morgen.

Heute komme ich nicht mehr dazu, aber morgen werde ich mir den Code ansehen. Vielen Dank! :)

Guido Eisenbeis 10. Jan 2020 15:39

AW: Download aus INet - fertiger Code gesucht
 
@KodeZwerg

Ich habe deinen Code ausprobiert. Ich habe ein paar einfache Test durchgeführt, und er funktioniert, wie du gesagt hast, für HTTP, aber nicht für HTTPS. So weit, so gut.

Vielen Dank für den Code! :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:42 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz