Entwickler-Ecke

Internet / Netzwerk - Idhttp: Name der Downloaddatei


pigfacejoe - So 07.01.07 11:52
Titel: Idhttp: Name der Downloaddatei
Hallo zusammen und Frohes Neues Jahr!
Ich will einen Download aus dem Internet starten, was ja auch soweit klappt. Allerdings möchte ich das File in einem Ordner ablegen, das Problem ist allerdings das ich im Quelltext schreibe, das beispielsweise der Pfad C:\test.exe ist, was mache ich nun aber , wenn die Datei mal eine .zip oder .jpg Datei ist?? Wie kann ich den Namen mit Endung der gedownloadeten Datei herausfinden mit der idhttp Komponente?

Vielen Dank für eure Antworten


pigfacejoe - So 07.01.07 17:07

Geht das überhaupt mit idhttp? Weil ich finde nix im forum


Harry M. - So 07.01.07 17:11

Na die weisste doch wenn Du die Datei anforderst http://www.bla.url/file.dat
Oder meinst Du ExtractFileExt


pigfacejoe - So 07.01.07 17:17

ja aber wie komme ich an das ende? also die Datei soll ja dann in den Programmordner als
file.dat gespeichert werden , nicht aber als http://www.bla.url/file.dat, damit der PC auch weiss , um welche date es sich handelt (z.B .exe oda so). Nur weiss ich nicht, wie ich nur an das Ende komme, also den namen der datei. Gibts da nicht sowas wie Extractfilename() oder so bei idhttp?


Harry M. - So 07.01.07 17:29

Bei IdHttp nicht aber in der SysUtils.
Ich will aber meinen man muss erst die Slashes erstezten.
Also:

Delphi-Quelltext
1:
2:
sUrl:=StringReplace(sUrl, '/''\', [rfReplaceAll]);
showmessage(ExtractFileExt(sUrl));


Edit: Du kannst auch den MIME-Type abfragen. Dann weisst Du genau um welcheDateitypen es sich handelt musst aber dann die Ext wieder selber definieren.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
function GetMIMEType(sFile: TFileName): String;
var
  MIMEMap: TIdMIMETable;
begin
  MIMEMap := TIdMIMETable.Create(True);
  Result := MIMEMap.GetFileMIMEType(sFile);
  MIMEMap.Free;
end;


jakobwenzel - So 07.01.07 17:36

Sowas ist schnell geschrieben (sofern man die Sourcen hat^^):


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
function ExtractHTTPFileExt(const FileName: string): string;
var
  I: Integer;
begin
  I := LastDelimiter('./', FileName);
  if (I > 0and (FileName[I] = '.'then
    Result := Copy(FileName, I, MaxInt) else
    Result := '';
end;


Ungetestet, war aber nur eine Änderung (+ Prozedurname)


Andidreas - So 07.01.07 17:57

Frage: wie lädst Du die Datei runter? Normalerweise gibt man den kompletten Dateinamen inklusive Extension an, also weißt Du doch um was für eine Datei es sich handelt. Dementsprechend wird der Filestream angelegt.


matze - So 07.01.07 18:08

es müsste aber auch irgenendwo im HTTP Header drinstehen.
und das wäre die beste Methode, da man ja auch z.b. mit PHP eine Art URL-Verschleierung machen kann.
Und wenn du dann z.b. von http://www.test.de/download.php?id=wasauchimmer eine Datei bekommst, dann heisst deine Datei auf der Festplatte download.php?id=wasauchimmer und du bekommst Probleme, weil ein ? in einem Dateinamen nicht erlaubt ist !

Also einfach mal in deine HTTP Header schauen !


Andidreas - So 07.01.07 18:13

IdHTTP.Head ist eigentlich nur für HTML. Auch wenn das klappen würde, muß er doch den kompletten Dateinamen inklusieve Extension angeben und zwar ohne Wildcards, sonst bekommt er die schöne Meldung: Multiple Choices.


pigfacejoe - So 07.01.07 18:27

Idhttp1.head gibts bei mir irgendwie nicht...


pigfacejoe - So 07.01.07 18:33

Ah sry, gibts doch :oops:
leider funktioniert das hier nicht:

Delphi-Quelltext
1:
Ziel:=ExtractFilePath(Paramstr(0))+idhttp1.head(edit1.Text);                    

und ich bekomme folgende meldung:
[Fehler] Unit1.pas(65): Inkompatible Typen: 'String' und 'procedure, untyped pointer or untyped parameter'
[Fataler Fehler] Project1.dpr(5): Verwendete Unit 'Unit1.pas' kann nicht compiliert werden

Was liefert die Prozedur überhaupt?


Andidreas - So 07.01.07 18:49

Und was soll das jetzt werden?


pigfacejoe - So 07.01.07 18:55

ja , keine ahnung^^
einfach mal geschrieben, ich weiss ja nicht was ich sonst probieren soll^^
Das hier klappt nur bei Adressen wie http://afrrese.de/test.exe nicht aber bei http://212.162.61.166/downloads/2887586/KnightOnlineSetup1453.exe?1168188730-1168195930-54b565-B-cec235a8c0ecd47a1cfbd9df8a05d1e8.exe , wie matze schon geschrieben hatte, jetz wiess ich halt nicht weiter


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
function ExtractHTTPFileExt(const FileName: string): string;
var
  I: Integer;
begin
  I := LastDelimiter('./', FileName);
  if (I > 0and (FileName[I] = '.'then
    Result := Copy(FileName, I, MaxInt) else
    Result := '';
end;


Andidreas - So 07.01.07 19:12

Den kompletten Dateinamen kennst Du aber?


Andidreas - So 07.01.07 19:23

So, kleines Testprogramm für Dich.


pigfacejoe - So 07.01.07 20:17

Hi Andidreas!
Danke für das Programm , das macht mein Programm ja auch , allerdings ist mein Problem , dass wenn der nutzer, der den Pfad angibt, beispielsweise bei chip.de die Verknüpfung kopiert, ist das so ein link , wie matze geschrieben hat, dann geht das eben nicht. Anders klappt meins ja auch schon , allerdings eben nicht bei einem link, der so aussieht:
http://www.test.de/download.php?id=wasauchimmer (wie bei matze) . Und das ist ja gerade mein Problem!!
Trotzdem Danke , dass du dir die Mühe gemacht hast!


Andidreas - So 07.01.07 20:23

Das dürfte ja wohl Absicht sein mit download.php?id= um eben einen direkten Download zuverhindern.
Siehe hier http://www.php4u.net/index.php?main=tut1 warum


pigfacejoe - So 07.01.07 20:33

ja ber wie machens dann andere Download Manager? Die müssen ja wohl irgendwoher den direkten Link haben , um an den namen der datei ranzukommen und die dateiendung, oder nicht? Bei mir klappt ja der Download, Fortschritt, Geschwindigkeit usw perfekt, das einzige was schwierigkeiten macht ist das dumme speichern, weil ich eben nicht weiss , ob es sich um eine .exe, .jpg... datei handelt
Ausserdem würde ich gernen den Namen des herstellers beibehalten, also nicht irgendwie unter Download 1 , Download 2 usw speichern.


Andidreas - So 07.01.07 20:43

Die senden das so, und bekommen die Datei. Da kann man wohl nur probieren. Hast Du zufällig so einen Link?


pigfacejoe - So 07.01.07 20:47

Klar: http://212.162.61.166/downloads/2887586/KnightOnlineSetup1453.exe?1168195204-1168202404-205e71-B-20f40a10b16b0d6143a8e1a54063e0b1.exe
also hier gehts z.b nicht un das ist (glaub ich) keine php?id= blabla Seite


Andidreas - Mo 08.01.07 18:20

So, hab die Sache mal etwas geändert.
Mir scheint Dein Link ist etwas verkehrt:
http://212.162.61.166/downloads/2887586/KnightOnlineSetup1453.exe?1168195204-1168202404-205e71-B-20f40a10b16b0d6143a8e1a54063e0b1.exe
http://212.162.61.166/downloads/2887586/KnightOnlineSetup1453.exe -> so funktioniert es.


pigfacejoe - Mo 08.01.07 19:32

Also bei mir funktionieren beide Links und wenn ich den "falschen" Link einsetzen klappts immernoch net, den anderen Link kann ich ja auch mit mienem Prog runterladen , nur halt nicht den 2. obwohl der im Browser (zumindest bei mir) klappt.
Naja, wenns da wirklich keine andere Möglichkeit gibt, muss ich halt diesen Sonderfall in meinem Programm auslassen und eine Fehlermeldung angeben (was ich allerdings blöd finde^^). Naja was solls falls jemand doch noch irgendeine Idee hat , kann er die ja hier posten ,dann wäre ich sehr froh!
Dann zum nächsten Problem (oder muss ich da einen neuen Thread aufmachen? :roll: )
Ich würde gerne meinen Download Manager starten , sobald im Browser ein "Downloadlink" geöffnet wird. Ist das überhaupt möglich, bzw ist das für mich überhaupt möglich oder ist das zu kompliziert? Weil ich finde es nicht gerade schön , immer den Link extra ins Edit Feld zu schreiben.
Also Vielen Vielen dank für die wirklichen schnellen Antworten (is in anderen Foren nie so) und danke für die Mühe!
Also falls mir jm noch helfen kann wär das echt nett!


Andidreas - Fr 12.01.07 20:56

So letzter Versuch.

Nicht vergessen im OI bei IdHTTP: HandleRedirect auf true stellen.


M4EiB - Sa 13.01.07 15:38

Wenn der richtige Dateiname nicht in der URL steht, wird er im Header als Content-Disposition mitgeschickt.
Schaut dann so aus:

Quelltext
1:
Content-Disposition: attachment; filename="echter name.rar"                    

Kannst du dann über idhttp.Response.RawHeaders auslesen. Musst dann noch den Namen aus 'attachment; filename="echter name.rar"' auslesen.
Und dann entweder zuerst die Daten temporär speichern und dann in eine Datei mit dem richtigen Namen kopieren. Oder die Header zuerst mit idhttp.head anfordern, den Namen extrahieren und dann mit Get in die richtige Datei leiten. Am besten wäre ein eigenes OnHeaderReceived Event, in dem du den FileStream mit dem richtigen Namen erstellen kannst, nachdem du den Namen bekommen hast.

M4


Andidreas - Sa 13.01.07 15:42

Dauert zu lange. Im IdHTTP HandleRedirect auf true setzen und dann kannst Du im OnRedirect b den Dateinamen aus dest übernehmen. Ansonsten steht der Dateiname ja schon mit im Link.


M4EiB - So 14.01.07 11:31

Nicht jeder Download endet durch Redirect in einer richtigen URL, so z.B. die Anhänge hier.

Noch zu:
http://212.162.61.166/downloads/2887586/KnightOnlineSetup1453.exe?1168195204-1168202404-205e71-B-20f40a10b16b0d6143a8e1a54063e0b1.exe
Alles nach dem ? wird als Query bezeichnet und gehört nicht mehr zum Pfad. Es gibt auch noch die Möglichkeit Parameter durch ";" getrennt an die URL zu hängen, das muss dann auch ignoriert werden.