![]() |
Delphi Indy Datei via URL downloaden und temporär öffnen?
Hallo zusammen,
ich lade momentan folgendermassen via Indy eine Datei herunter:
Code:
Das funktioniert soweit auch, dennoch habe ich hierzu zwei Fragen:
IdHTTP.Get(Host + '/restapi/index.php/document/' + String(lvSearch.Items.Item[i].Data) + '/content', Stream);
Stream.SaveToFile(GetSpecialFolder(CSIDL_APPDATA) + '\test.msg'); 1. Ich muss ja derzeit für das SaveToFile die Dateiendung und vorzugsweise auch den Dateinamen vorab wissen. Besteht die Möglichkeit, dass mir die Indy Komponente das vorab liefern kann so dass die Datei (Dateityp hinter dem Download kann sich ändern) immer mit korrekter Endung gespeichert wird? 2. Gibt es eine Möglichkeit, die heruntergeladene Datei nicht zu speichern und quasi "nur" temporär direkt aus dem Stream heraus zu öffnen? Falls nicht, besteht die Möglichkeit zu erkennen ob die heruntergeladene Datei noch offen ist und falls nicht, diese dann zu löschen? Zum Hintergrund: Ich bastel gerade an einem Outlook Addin, welches in einem DMS nach Dokumenten sucht. Durch Doppelklick auf das Dokument, soll dieses vom DMS via URL heruntergeladen und geöffnet werden. Aber lediglich nur zur Anzeige. Wenn ich das Dokument wieder schließe, dann soll die temporär heruntergeladene Datei gelöscht werden. Vielen Dank im Voraus schon mal für Eure Hilfe. Falls Ihr mehr Informationen benötigt, so meldet Euch gern. |
AW: Delphi Indy Datei via URL downloaden und temporär öffnen?
Sowas?
Delphi-Quellcode:
Statt TStringList kannst Du auch alles andere nehmen, was über eine Methode LoadFromStream o. ä. verfügt. Das könnte z. B. ein TMemo sein. 'nen Dateinamen brauchst Du für sowas nicht.
var
sl : TStringList; sUrl : String; begin sl := TStringList.Create; sUrl := Format('%s/restapi/index.php/document/%s/content', [Host,String(lvSearch.Items.Item[i].Data)]); IdHTTP.Get(sUrl, Stream); Stream.Position := 0; sl.LoadFromStream(Stream); ShowMessage(sl.Text); sl.Free; end; Willst Du nur Infos über einen "demnächst" durchzuführenden Download, kannst Du auch eine Head-Abfrage machen. Aus RawHeaders ('ner TStringList) kannst Du Dir dann die gewünschte Info raussuchen. Dann wird aus Deiner Routine sowas in der Art:
Delphi-Quellcode:
Ungetestet hingedaddelt.
var
sl : TStringList; sUrl : String; sDatei : String; begin sl := TStringList.Create; sUrl := Format('%s/restapi/index.php/document/%s/content', [Host,String(lvSearch.Items.Item[i].Data)]); IdHTTP.Head(sUrl); // Wenn das Laden des Inhaltes nicht direkt per Stream möglich sein sollte: sDatei := Format('%s\%s',[GetSpecialFolder(CSIDL_APPDATA),IdHTTP.Response.RawHeaders.Values['Filename']]); // oder wie das da im konkreten Einzelfall heißen mag. IdHTTP.Get(sUrl, Stream); Stream.SaveToFile(sDatei); sl.LoadFromFile(sDatei); ShowMessage(sl.Text); sl.Free; DeleteFile(sDatei); end; |
AW: Delphi Indy Datei via URL downloaden und temporär öffnen?
Indy enthält eine Methode GetMIMEDefaultFileExt mit der sich zu einem MIME-Typ die Dateiendung ermitteln lässt:
Delphi-Quellcode:
Beispiel: GetExtension('application/pdf') -> Endung '.pdf'
uses
..., IdGlobalProtocols; function GetExtension(const AMIMEType: string); begin Result := GetMIMEDefaultFileExt(AMIMEType); end Quelle: ![]() Den MIME-Typ sendet der HTTP Server mit der Antwort als Response Header mit, d.h. die Funktion arbeitet auch dann wenn der URL selbst keine Datei-Endung enthält. |
AW: Delphi Indy Datei via URL downloaden und temporär öffnen?
Erstmal Danke für Eure Antworten.
Scheinbar gibt mir aber der Server keinen MIME Typ zurück. Kann man das irgendwie prüfen? |
AW: Delphi Indy Datei via URL downloaden und temporär öffnen?
Was steht denn in IdHTTP.Response.RawHeaders.Text?
Ist da nix auswertbares bei? Könntest Du den Inhalt davon eventuell mal hier posten? |
AW: Delphi Indy Datei via URL downloaden und temporär öffnen?
Nee da ist leider nix dabei:
Code:
Date: Fri, 07 Jun 2019 08:34:41 GMT
Server: Apache/2.4.29 (Ubuntu) Keep-Alive: timeout=5, max=99 Connection: Keep-Alive Content-Type: text/html; charset=UTF-8 Kann es evtl. an der Apache Konfiguration liegen? |
AW: Delphi Indy Datei via URL downloaden und temporär öffnen?
Zitat:
Was passiert denn wenn man mit dem Browser eine Datei im CMS auswählt / anklickt und diese herunterlädt, zeigt der Browser dann die richtige Dateierweiterung im Download-Dialog an, oder nur HTML? Wenn es im Browser anders ist als beim Indy-HTTP Download, dann kann es an einem fehlerhaft konfigurierten Request aus Indy liegen... |
AW: Delphi Indy Datei via URL downloaden und temporär öffnen?
Nimm doch Content-Type: text/html; charset=UTF-8.
Davon brauchst Du "text/html", das spendierst Du dann GetMIMEDefaultFileExt und die gesuchte Dateiendung sollte da rauskommen. Ungetestet sowas in der Art:
Delphi-Quellcode:
function GetExtension(const AMIMEType: string);
begin Result := GetMIMEDefaultFileExt(AMIMEType); end; ... var sType : String; i : Integer; begin sType := IdHTTP.Response.RawHeaders.Values['Content-Type']; i := Pos(' ',sType); if i > 0 then sType := Copy(sType,1,i - 1); ShowMessage(GetExtension(sType)); ... end; |
AW: Delphi Indy Datei via URL downloaden und temporär öffnen?
Zitat:
|
AW: Delphi Indy Datei via URL downloaden und temporär öffnen?
Wir wissen aber nicht, ob Indy konstant text/hmtl erhält, sondern nur aus einem Beispiel, dass es bei diesem text/hmtl erhält.
Zuerst wäre also mal zu prüfen, ob Indy immer text/html enthält oder nur bei bestimmten Dokumenten. Und wenn man sich mal hier von der Delphipraxis die Headerdaten anschaut, so bekommt man auch keinen Mime-Type, sondern "nur" den Content-Type von 'nem Apache-Server geliefert. Und der passt immer zum Typ der geladenen Daten, wie z. B.:
Code:
Der Apache arbeitet schon durchaus korrekt.
text/html; charset=iso-8859-1
text/css application/javascript image/png image/gif ... Jedenfalls entnehme ich den Dateityp seit gefühlten Jahrzehnten regelmäßig dem Content-Type und das klappte bisher immer, egal welcher Webserver auf der "Gegenseite" steht. Der TE sollte also bitte erstmal prüfen, ob er immer nur text/html als Content-Type geliefert bekommt oder nur bei HTML. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:40 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz