Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi RAD Server - Download einer Datei über die RAD Server komponenten (https://www.delphipraxis.net/209332-rad-server-download-einer-datei-ueber-die-rad-server-komponenten.html)

fisipjm 23. Nov 2021 15:46

Delphi-Version: 10.4 Sydney

RAD Server - Download einer Datei über die RAD Server komponenten
 
Moin Moin - oder guten Abend :cyclops:

Ich stehe vor folgendem Problem und komme nicht so recht weiter. Ich Arbeite aktuell an einem recht großen Projekt, dass ich mit dem RAD Server zu großen Teilen schon umgesetzt habe.
Abfrage und Schreibenauf Datenbank usw, läuft schon super. Jetzt möchte ich einen Dateiaustausch umsetzen.
Also Konkret möchte ich das ich eine URL mit ID in das Backen werfe und mir mein Client dann ein Fenster bringt wo ich aussuchen kann an welchen Platz ich die Datei speichern möchte.
Über die Indy Komponenten hätte ich das schon 10 mal gelöst, leider muss ich aber den weg über die RADServer komponenten gehen. In dem fall den TbackendEndpoint weil ich die Authentifizierung benötige die da inkludiert ist.

Meine Frage, wie komm ich von der Komponente an die Datei ran? Ich finde keine Dokumentation oder Beispiele dazu alles was mit Dateien zusammenhängt ist immer über ein eigens HTML gelöst und zeigt dann Bilder an, aber ein Download einer Datei kann ich nirgends finden.

Grüße
PJM

fisipjm 23. Nov 2021 16:07

AW: RAD Server - Download einer Datei über die RAD Server komponenten
 
Kaum mach ichs Ma... zu :-D
Hier die Antwort für alle interessierten


Delphi-Quellcode:
  EndpointRead.Execute;
  var lstrstream: TStringStream := TStringStream.Create(EndpointRead.Response.content, TEncoding.UTF8);
  if SaveDialog1.Execute then
  lstrstream.SaveToFile(SaveDialog1.FileName);

himitsu 23. Nov 2021 16:35

AW: RAD Server - Download einer Datei über die RAD Server komponenten
 
Das ": TStringStream" kannst'e weglassen, wenn du magst. (Typinferenz)

Und du gibt lstrstream natürlich auch wieder frei?


Ist Response.content zufällig ein String?
oder Byte-Array (WriteAllBytes), oder String-Array (WriteAllLines), oder ...
Delphi-Quellcode:
EndpointRead.Execute;
if SaveDialog1.Execute then
  TFile.WriteAllText(SaveDialog1.FileName, EndpointRead.Response.content, TEncoding.UTF8);

fisipjm 25. Nov 2021 08:02

AW: RAD Server - Download einer Datei über die RAD Server komponenten
 
Zitat:

Zitat von himitsu;14980
Ist Response.content zufällig ein String?
oder Byte-Array (WriteAllBytes), oder String-Array (WriteAllLines), oder ...
[DELPHI
EndpointRead.Execute;
if SaveDialog1.Execute then
TFile.WriteAllText(SaveDialog1.FileName, EndpointRead.Response.content, TEncoding.UTF8);[/DELPHI]

Ähm ja, Response.Content ist ein String wieso? :-)
Funktioniert das dann auch mit Dateien die keine testdateien sind? Muss ich mal testen :-)

TiGü 25. Nov 2021 08:39

AW: RAD Server - Download einer Datei über die RAD Server komponenten
 
Zitat:

Zitat von fisipjm (Beitrag 1498141)
Zitat:

Zitat von himitsu (Beitrag 14980)
Ist Response.content zufällig ein String?
oder Byte-Array (WriteAllBytes), oder String-Array (WriteAllLines), oder ...
Delphi-Quellcode:
EndpointRead.Execute;
if SaveDialog1.Execute then
  TFile.WriteAllText(SaveDialog1.FileName, EndpointRead.Response.content, TEncoding.UTF8);

Ähm ja, Response.Content ist ein String wieso? :-)
Funktioniert das dann auch mit Dateien die keine testdateien sind? Muss ich mal testen :-)

Himi will darauf hinaus, dass du per EndpointRead.Response auf die Content-Property: string von der Response: TCustomRESTResponse-Klasse gehst.
Wenn du dir in der Unit REST.Client mal anschaust, wie das implementiert ist, wirst du auch sehen, dass es eine property namens RawBytes: TBytes gibt.
Je nach Inhalt deines Responses kann es vorteilhaft sein, gleich die Binärdaten zu nehmen/verarbeiten/abzuspeichern.

fisipjm 25. Nov 2021 09:02

AW: RAD Server - Download einer Datei über die RAD Server komponenten
 
[QUOTE=TiGü;1498145][QUOTE=fisipjm;1498141][QUOTE=himitsu;14980
Wenn du dir in der Unit REST.Client mal anschaust, wie das implementiert ist, wirst du auch sehen, dass es eine property namens RawBytes: TBytes gibt.
Je nach Inhalt deines Responses kann es vorteilhaft sein, gleich die Binärdaten zu nehmen/verarbeiten/abzuspeichern.[/QUOTE]

Hab mir fast gedacht das es da noch was besseres als Content gibt. Habs aber irgendwie nicht gefunden :oops:

Das Heist das würde ich dann so machen?
Delphi-Quellcode:
.....
Stream := TFileStream.Create(SaveDialog1.FileName, fmCreate);
  try
    if Response.Body.rawbyte <> nil then
      Stream.WriteBuffer(Response.Body.rawbyte[0], Length(Response.Body.rawbyte));
  finally
    Stream.Free;
  end;
.....
Danke für die gute Hilfe :)

TiGü 25. Nov 2021 09:41

AW: RAD Server - Download einer Datei über die RAD Server komponenten
 
Delphi-Quellcode:
    if Response.ContentLength > 0 then // oder Response.HasResponseContent wenn Response ein Interface vom Typ IRESTResponseJSON sein sollte/gecastet worden ist!
    begin
      try
        System.IOUtils.TFile.WriteAllBytes(SaveDialog1.FileName, Response.RawBytes);
      except
        // reagieren auf die möglichen Exceptions überbleibt dem geneigten Leser als Hausaufgabe!
        on E: ENotSupportedException do
        begin

        end;
        on E: EArgumentException do
        begin

        end;
        on E: EDirectoryNotFoundException do
        begin

        end;
        on E: EFileNotFoundException do
        begin

        end;
      end;
    end;

fisipjm 25. Nov 2021 10:10

AW: RAD Server - Download einer Datei über die RAD Server komponenten
 
Zitat:

Zitat von TiGü (Beitrag 1498155)
Delphi-Quellcode:
    if Response.ContentLength > 0 then // oder Response.HasResponseContent wenn Response ein Interface vom Typ IRESTResponseJSON sein sollte/gecastet worden ist!
    begin
      try
        System.IOUtils.TFile.WriteAllBytes(SaveDialog1.FileName, Response.RawBytes);
      except
        // reagieren auf die möglichen Exceptions überbleibt dem geneigten Leser als Hausaufgabe!
        on E: ENotSupportedException do
        begin

        end;
        on E: EArgumentException do
        begin

        end;
        on E: EDirectoryNotFoundException do
        begin

        end;
        on E: EFileNotFoundException do
        begin

        end;
      end;
    end;

Ist ein Großteil der Meldungen nicht durch die Verwendung von Savedialog schon ausgeschlossen?:?:

TiGü 25. Nov 2021 10:29

AW: RAD Server - Download einer Datei über die RAD Server komponenten
 
Gewiss, aber in dreieinhalb Monaten refaktorist du das oder jemand anderes so, dass es eine eigene Methode wird.
Mit reiner Übergabe des Dateinamens als String damit keine Koppelung zwischen SaveDialog und abspeichern besteht und dann geht's wieder von vorne los.

fisipjm 25. Nov 2021 10:50

AW: RAD Server - Download einer Datei über die RAD Server komponenten
 
Zitat:

Zitat von TiGü (Beitrag 1498164)
Gewiss, aber in dreieinhalb Monaten refaktorist du das oder jemand anderes so, dass es eine eigene Methode wird.
Mit reiner Übergabe des Dateinamens als String damit keine Koppelung zwischen SaveDialog und abspeichern besteht und dann geht's wieder von vorne los.

:lol::lol: na dann zieh ich das doch einfach mal in die Zukunft und mach direkt eine eigene Methode draus, besser ist das :lol::lol:

Danke für die Hinweise, hast ja absolut recht :wink:


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:35 Uhr.
Seite 1 von 2  1 2      

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