Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Delphi Indy Datei via URL downloaden und temporär öffnen? (https://www.delphipraxis.net/200914-delphi-indy-datei-via-url-downloaden-und-temporaer-oeffnen.html)

CG2003 6. Jun 2019 14:42

Delphi Indy Datei via URL downloaden und temporär öffnen?
 
Hallo zusammen,

ich lade momentan folgendermassen via Indy eine Datei herunter:

Code:
IdHTTP.Get(Host + '/restapi/index.php/document/' + String(lvSearch.Items.Item[i].Data) + '/content', Stream);
Stream.SaveToFile(GetSpecialFolder(CSIDL_APPDATA) + '\test.msg');
Das funktioniert soweit auch, dennoch habe ich hierzu zwei Fragen:

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.

Delphi.Narium 6. Jun 2019 15:15

AW: Delphi Indy Datei via URL downloaden und temporär öffnen?
 
Sowas?
Delphi-Quellcode:
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;
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.

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:
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;
Ungetestet hingedaddelt.

mjustin 6. Jun 2019 16:58

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:
uses
  ..., IdGlobalProtocols;

function GetExtension(const AMIMEType: string);
begin
  Result := GetMIMEDefaultFileExt(AMIMEType);
end
Beispiel: GetExtension('application/pdf') -> Endung '.pdf'

Quelle: https://stackoverflow.com/a/44954955/80901, mit Hinweise zur Optimierung.

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.

CG2003 6. Jun 2019 20:52

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?

Delphi.Narium 7. Jun 2019 09:01

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?

CG2003 7. Jun 2019 09:35

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?

mjustin 7. Jun 2019 10:05

AW: Delphi Indy Datei via URL downloaden und temporär öffnen?
 
Zitat:

Zitat von CG2003 (Beitrag 1434118)
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?

Das ist anzunehmen. Allerdings wenn das der richtige Response-Header ist und darin Content-Type: text/html; charset=UTF-8 steht, dann würde beim Download mit einem Webbrowser dieser anbieten, das Dokument als HTML Datei zu speichern. Wenn der Browser HTML erkennt, es aber z.B. ein PDF ist, läuft etwas schief auf dem Server.

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...

Delphi.Narium 7. Jun 2019 10:09

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;

mjustin 7. Jun 2019 10:18

AW: Delphi Indy Datei via URL downloaden und temporär öffnen?
 
Zitat:

Zitat von Delphi.Narium (Beitrag 1434121)
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.

Ja, für HTML wäre e .html (früher .htm). Im Originalpost steht, dass in der URL kein Dateiname enthalten ist und der Dateityp sich ändern kann. Wenn Indy konstant text/hmtl erhält, kommt von GetMIMEDefaultFileExt dann immer nur .html.

Delphi.Narium 7. Jun 2019 10:31

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:
text/html; charset=iso-8859-1
text/css
application/javascript
image/png
image/gif
...
Der Apache arbeitet schon durchaus korrekt.

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 00:31 Uhr.
Seite 1 von 4  1 23     Letzte »    

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