AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Delphi Indy Datei via URL downloaden und temporär öffnen?

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

Ein Thema von CG2003 · begonnen am 6. Jun 2019 · letzter Beitrag vom 3. Jul 2019
Antwort Antwort
Seite 1 von 4  1 23     Letzte » 
CG2003

Registriert seit: 8. Nov 2003
Ort: Hamburg
470 Beiträge
 
Delphi 2009 Professional
 
#1

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

  Alt 6. Jun 2019, 14:42
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.
Sebastian M.
Viele Grüße aus Hamburg


Meine Website: www.sebastian-mundt.com
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.415 Beiträge
 
Delphi 7 Professional
 
#2

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

  Alt 6. Jun 2019, 15:15
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.
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.004 Beiträge
 
Delphi 2009 Professional
 
#3

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

  Alt 6. Jun 2019, 16:58
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.
Michael Justin
habarisoft.com
  Mit Zitat antworten Zitat
CG2003

Registriert seit: 8. Nov 2003
Ort: Hamburg
470 Beiträge
 
Delphi 2009 Professional
 
#4

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

  Alt 6. Jun 2019, 20:52
Erstmal Danke für Eure Antworten.
Scheinbar gibt mir aber der Server keinen MIME Typ zurück.
Kann man das irgendwie prüfen?
Sebastian M.
Viele Grüße aus Hamburg


Meine Website: www.sebastian-mundt.com
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.415 Beiträge
 
Delphi 7 Professional
 
#5

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

  Alt 7. Jun 2019, 09:01
Was steht denn in IdHTTP.Response.RawHeaders.Text?

Ist da nix auswertbares bei?

Könntest Du den Inhalt davon eventuell mal hier posten?
  Mit Zitat antworten Zitat
CG2003

Registriert seit: 8. Nov 2003
Ort: Hamburg
470 Beiträge
 
Delphi 2009 Professional
 
#6

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

  Alt 7. Jun 2019, 09:35
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?
Sebastian M.
Viele Grüße aus Hamburg


Meine Website: www.sebastian-mundt.com
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.004 Beiträge
 
Delphi 2009 Professional
 
#7

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

  Alt 7. Jun 2019, 10:05
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...
Michael Justin
habarisoft.com
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.415 Beiträge
 
Delphi 7 Professional
 
#8

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

  Alt 7. Jun 2019, 10:09
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;
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.004 Beiträge
 
Delphi 2009 Professional
 
#9

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

  Alt 7. Jun 2019, 10:18
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.
Michael Justin
habarisoft.com
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.415 Beiträge
 
Delphi 7 Professional
 
#10

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

  Alt 7. Jun 2019, 10:31
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.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:48 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