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 > 0) and (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?
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!
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 - 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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!