Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Download-Programm (https://www.delphipraxis.net/100441-download-programm.html)

Alex_XP 28. Sep 2007 09:53


Download-Programm
 
Hallo,

ich hab schon gesucht und nur bruchstücke von dem gefunden, was ich suche.

Daher meine Problem:

Ich möchte ein Programm bauen, dass dateien aus dem Internet runterlädt und auf der Festplatte speichert.

Das ganze soll in etwa so funktionieren:

Das Programm lädt eine Textdatei aus dem internet. Die Links, welche in der Textdatei stehen werden sollen dann in eine Listbox geladen werden.
Nun soll man einzelne Links aus der Listbox auswählen können und über einen button die datei downloaden und speichern können.

Zu guter letzt nur noch folgendes.
Beim start soll das Programm ein Bild aus dem internet laden und im Formular anzeigen.
Das Problem ist nur, dass ich bei einem image keine internet url angeben kann (bzw. nicht so angeben kann wie eine lokale bildadresse)

Ich hoffe ihr könnt mir weiterhelfen.

MfG Alex

s-off 28. Sep 2007 09:55

Re: Download-Programm
 
Benutze die Indy-Komponenten zum herunterladen des Bildes in ein Verzeichnis Deiner Wahl, und lade dieses dann in Dein Image.

Alex_XP 28. Sep 2007 09:58

Re: Download-Programm
 
tut mir leid, aber mit indy komponenten kenne ich mich nicht so au und weiß daher nicht wie ich die für das bild benutzen kann.

s-off 28. Sep 2007 10:02

Re: Download-Programm
 
Naja, irgendwelche Komponenten wirst Du doch auch benutzen, um hinterher irgendwelche Dateien aus dem Internet herunterladen zu können, oder hast Du Dich diesbezüglich noch nicht entschieden?

Ich habe die Indies nicht installiert; daher kann ich Dir leider nicht sagen, welche Komponente das ist.

Klaus01 28. Sep 2007 10:06

Re: Download-Programm
 
Guten Morgen,

wie wird den das textfile geladen?

Zum dem Punkt: ein Image hat keine URL
Warum denn das nicht, wenn sie auf einem Webserver liegt hat sie auch eine URL.
http://www.TestServer.com/bilder/bild1.jpg zum Beispiel.

Grüße
Klaus

s-off 28. Sep 2007 10:07

Re: Download-Programm
 
Zitat:

Zitat von Klaus01
Zum dem Punkt: ein Image hat keine URL
Warum denn das nicht, wenn sie auf einem Webserver liegt hat sie auch eine URL.
http://www.TestServer.com/bilder/bild1.jpg zum Beispiel.

Er meint sicherlich, dass ein TImage keine Möglichkeit hat, ein Picture aus einer URL zu laden, anstelle aus einem lokalen Dateipfad.

Alex_XP 28. Sep 2007 10:23

Re: Download-Programm
 
Richtig erkannt. ich meine bei TImage kann ich nur lokale orte angeben.

Nochmal zu den Komponenten:
Habe mich da noch nicht entschieden, da ich nicht weiß, was ich da am bessten nehmen soll.
Was würdet ihr mir denn da empfehlen?

Klaus01 28. Sep 2007 10:24

Re: Download-Programm
 
mit den Indys (9) sollte es so funktionieren.

Unter uses hinzufügen:

Delphi-Quellcode:
dBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP
dann sollte es doch so gehen.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  MemStream: TMemoryStream;
  idhttp1 : TidHTTP
begin
 idhttp1 := TidHTTP.Create(nil);
 MemStream := TMemoryStream.Create;
 idhttp1.Get('Deine Bilder url',MemStream);
 MemStream.Position:=0;
 Image1.Picture.Bitmap.LoadFromStream(MemStream);
 MemStream.Free;
 idhttp1.Free
end;
Grüße
Klaus

s-off 28. Sep 2007 10:29

Re: Download-Programm
 
Darf ich fragen, was der Grund ist, beim Start ein Bild aus dem www anzuzeigen?

Alex_XP 28. Sep 2007 10:34

Re: Download-Programm
 
ganz einfach, damit da dann Werbung erscheinen kann.

aber nochaml zu dem Code oben:

wenn ich bei uses
Delphi-Quellcode:
dBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP
einfüge sagt delphi dass er dBaseComponent.dcu nicht findet.
Bei den anderen sachen ist es genauso.

Wo kann ich das zeug denn runterladen?

s-off 28. Sep 2007 10:36

Re: Download-Programm
 
Mit ein bissel Überlegung und Betrachtung der anderen Einträge in der Uses-Klausel, hättest Du gemerkt, dass es 'IdBaseComponent' lauten muss :zwinker:

Trotzalledem musst Du die Komponenten natürlich erst installieren. Du findest einen Link dorthin, sowie ein Tutorial zu den Komponenten hier.

Alex_XP 28. Sep 2007 10:40

Re: Download-Programm
 
Ist ja schön und gut, es funktioniert aber trotzdem nicht.

Außerdem sagte ich ja bereits oben
Zitat:

Bei den anderen sachen ist es genauso.
daher liegt es also nicht am fehlenden I

Lade mir die Komponenten dann mal runter

Kevin 28. Sep 2007 11:04

Re: Download-Programm
 
Zitat:

Zitat von Alex_XP
Lade mir die Komponenten dann mal runter

Und dann wunderst Du Dich, daß die Komponenten (noch) nicht gefunden werden...?! :gruebel:

s-off 28. Sep 2007 12:36

Re: Download-Programm
 
Zitat:

Zitat von s-off
Trotzalledem musst Du die Komponenten natürlich erst installieren.

:zwinker:

Rastaman 28. Sep 2007 15:31

Re: Download-Programm
 
MSDN-Library durchsuchenURLDownloadToFile ist doch viel einfacher und braucht keine Indys.

s-off 28. Sep 2007 15:40

Re: Download-Programm
 
Zitat:

Zitat von Rastaman
MSDN-Library durchsuchenURLDownloadToFile ist doch viel einfacher und braucht keine Indys.

Sehr schön, kannte ich noch gar nicht :thumb:

Delphi-Quellcode:
Procedure TForm1.Button2Click(Sender: TObject);
Const
   sSOURCE: String = 'http://www.delphipraxis.net/templates/DPClassicBlue/images/logo_left.gif';
   sTARGET: String = 'C:\Download\Test.gif';
Begin
   URLDownloadToFile(Nil, PChar(sSOURCE),PChar(sTARGET), 0, Nil);
End;
Funktioniert einwandfrei! Man lernt nie aus - danke :-D

Klaus01 28. Sep 2007 15:49

Re: Download-Programm
 
Zitat:

Zitat von Rastaman
MSDN-Library durchsuchenURLDownloadToFile ist doch viel einfacher und braucht keine Indys.

Hallo Rastaman,

muß ich mir auch notieren und wenn ich es brauche auch wiederfinden.

Grüße
Klaus

IceTube 28. Sep 2007 19:03

Re: Download-Programm
 
Zitat:

URLDownloadToFile ist doch viel einfacher und braucht keine Indys.
^Indy ist doch nicht SO schwer !?!

s-off 28. Sep 2007 20:00

Re: Download-Programm
 
Zitat:

Zitat von IceTube
Zitat:

URLDownloadToFile ist doch viel einfacher und braucht keine Indys.
^Indy ist doch nicht SO schwer !?!

Hmpf, darum geht es doch gar nicht. Freu Dich doch, dass jemand eine Alternative vorstellt, die mit Hausmittelchen auskommt und keinerlei Drittkomponenten benötigt...
Also ich habe mich über 'URLDownloadToFile' sehr gefreut :!:

Rastaman 29. Sep 2007 01:03

Re: Download-Programm
 
Ich hab mir ma die Mühe gemacht eine Funktion mit Downloadgeschwindigkeit zu basteln für größere Dateien.
Habe hier allerdings nur VC installiert, werde alles aber morgen so gut es geht nach Delphi übersetzen.
Hat auch den Vorteil, dass das Programm nicht komplett einfriert.
Wer grad Lust hat kann mir das Übersetzen ja schonma abnehmen :-D

Code:
bool DownloadFile(const char *lpszURL, const char *lpszFile)
{
   bool   result = false;
   int      kbpsCounter = 0;
   int      kbps;
   DWORD   ticks, bytesRead;
   BYTE   buffer[1024];

   FILE   *hDLFile;

   HINTERNET hSession, hRequest;

   /* Session öffnen */
   hSession = InternetOpen("AppTitel", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
   if (hSession != NULL)
   {
      /* URL öffnen */
      hRequest = InternetOpenUrl(hSession, lpszURL, NULL, 0, INTERNET_FLAG_RELOAD, 0);
      if (hRequest != NULL)
      {
         /* Download starten
            Vllt checken ob Datei schon existiert? */
         hDLFile = fopen(lpszFile, "wb");
         if (hDLFile != NULL)
         {
            ticks = GetTickCount();
            while (true)
            {
               /* Daten auslesen */
               if (InternetReadFile(hRequest, buffer, 1024, &bytesRead) ==   false)
               {
                  break;
               }

               /* kbps jede Sekunde berechnen */
               kbpsCounter += bytesRead;
               if (ticks <= (GetTickCount() - 1000))
               {
                  kbps = kbpsCounter / 1024;
                  printf("%d kb/s\n", kbps);   //kbps ausgeben
                  kbpsCounter = 0;
                  ticks = GetTickCount();
               }

               /* In Datei schreiben */
               if (bytesRead != 0)
               {
                  fwrite(buffer, bytesRead, 1, hDLFile);
               }
               else   // Download beendet
               {
                  result = true;
                  break;
               }

            }
            fclose(hDLFile);
         }
         InternetCloseHandle(hRequest);
      }
      InternetCloseHandle(hSession);
   }
   return result;
}
Aufruf:
Code:
DownloadFile("http://www.Delphipraxis.net", "index.html");

Rastaman 29. Sep 2007 13:24

Re: Download-Programm
 
Soooo. Ungetestet ...

Delphi-Quellcode:
function TForm1.DownloadFile(const URL: String; const FileName: String)
var
   KbpsCounter: Integer = 0;
   Kbps: Integer;

   Ticks, BytesRead: DWORD;
   Buffer: Array [0..1023] of Byte;

   DownloadFile: File;

   hSession, hRequest: HINTERNET;
begin
   Result := False;

   (* Session öffnen *)
   hSession :=   InternetOpen('AppTitel', INTERNET_OPEN_TYPE_DIRECT, nil, nil, 0);
   if hSession <> nil then
   begin
      (* URL öffnen *)
      hRequest :=   InternetOpenUrl(hSession, URL, nil, 0, INTERNET_FLAG_RELOAD, 0);
      if hRequest <> nil then
      begin
         (* Download starten
            vllt checken ob Datei schon existiert? *)
         AssignFile(DownloadFile, FileName);
         try
            Rewrite(DownloadFile, 1);   
            Ticks := GetTickCount;

            while True do
            begin
               (* Daten auslesen *)
               if InternetReadFile(hRequest, @Buffer, 1024, BytesRead) = False then
                  Break;

               (* kbps jede Sekunde berechnen *)
               Inc(KbpsCounter, BytesRead);
               if Ticks <= (GetTickCount - 1000) then
               begin
                  Kbps := KbpsCounter / 1024;
                  // Label1.Caption := IntToStr(Kbps) + ' Kilobyte pro Sekunde';
                  KbpsCounter := 0;
                  Ticks := GetTickCount;
               end;

               (* In Datei schreiben *)
               if BytesRead <> 0 then
                  BlockWrite(DownloadFile, Buffer, BytesRead);
               else //Download beendet
               begin
                  Result := True;
                  Break;
               end;

               Application.ProcessMessages;
            end;
         finally
            CloseFile(DownloadFile);
            CloseInternetHandle(hRequest);
         end;
      end;
      CloseInternetHandle(hSession);
   end;
end;
Aufruf is ja klar :wink:
Bitte mal testen und Fehler berichtigen.

MFG
Rasta

Edit:
Eine Fortschrittsanzeige wäre sicherlich ein Leichtes, allerdings habe ich beim Versuch die Dateigröße zu ermitteln
immer 0 Byte zurück bekommen, also habe ich es erstmal raus genommen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:53 Uhr.

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