Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Inhalt eines Blob-Feldes als Datei speichern (https://www.delphipraxis.net/188574-inhalt-eines-blob-feldes-als-datei-speichern.html)

HPB 17. Mär 2016 07:39

Datenbank: Interbase • Version: XE2 • Zugriff über: IB

Inhalt eines Blob-Feldes als Datei speichern
 
Liste der Anhänge anzeigen (Anzahl: 1)
Guten Tag Delphianer,
ich habe in einem Blob-Feld, Text und eine Grafik gespeichert.
Wie kann ich ich den Inhalt des Blobfeldes in eine Datei auf der Festplatte
schreiben? Wie wird die Dateiextension heissen? *.jpg, *.txt???
Es ist ja Text und Grafik enthalten.
Wozu das ganze dienen soll ist folgendes:
Ich möchte dieses Blob-Feld in die ADVRichEdit-Komponente einfügen.
Dazu wird der folgende Befehl benötigt:
Delphi-Quellcode:
advrchdtrMailBody.InsertAsRTF(Signatur);
Jedoch wird nichts angezeigt.

Wenn ich das Blob-Feld jedoch in einer JVRichedit-Komponente einfüge:
Delphi-Quellcode:
jedMailBody.Lines.Add(Signatur);
Wird alles korrekt angezeigt. Siehe auch den Anhang.

Nach Rücksprache mit TMS möchte Bruno Fierens nun den Inhalt des Blobfeldes als Datei
haben.
Zitat:

Can you save the widestring to file and send it, so I can inspect and know how exactly it is formatted.
Aber wie gebe ich das Blob-Feld als Datei aus??

Mit Gruß
HPB

nahpets 17. Mär 2016 08:18

AW: Inhalt eines Blob-Feldes als Datei speichern
 
Hilft Dir das? http://www.scalabium.com/faq/dct0141.htm
Oder das? http://stackoverflow.com/questions/1...using-firebird

baumina 17. Mär 2016 08:22

AW: Inhalt eines Blob-Feldes als Datei speichern
 
Und als Dateiendung würde ich .rtf nehmen.

Sir Rufo 17. Mär 2016 08:27

AW: Inhalt eines Blob-Feldes als Datei speichern
 
Ich tippe mal darauf, dass sich in dem Blob-Feld RichText befindet.

Damit wäre die Endung der Datei auch klar: .rtf :stupid:

Um Blob-Daten in eine Datei zu speichern bietet sich folgendes an:
Delphi-Quellcode:
unit Unit2;

interface

uses
  System.Classes,
  System.SysUtils;

type
  TStreamData = class abstract( TInterfacedPersistent, IStreamPersist )
  private
    function SupportsStreamPersist( Persistent: TPersistent; var StreamPersist: IStreamPersist ): Boolean;
    procedure LoadFromStreamPersist( const Source: IStreamPersist );
    procedure SaveToStreamPersist( const Dest: IStreamPersist );
  protected
    function GetDataStream( const Writeable: Boolean ): TStream; virtual; abstract;
    procedure AssignTo( Dest: TPersistent ); override;
  public
    procedure Assign( Source: TPersistent ); override;
    procedure LoadFromStream( Stream: TStream );
    procedure SaveToStream( Stream: TStream );
  end;

  TFileStreamData = class( TStreamData )
  private
    FFileName: string;
  protected
    function GetDataStream( const Writeable: Boolean ): TStream; override;
  public
    constructor Create( const FileName: string );
  end;

implementation

{ TStreamData }

procedure TStreamData.Assign( Source: TPersistent );
var
  lSource: IStreamPersist;
begin
  if SupportsStreamPersist( Source, lSource )
  then
    LoadFromStreamPersist( lSource )
  else
    inherited;
end;

procedure TStreamData.AssignTo( Dest: TPersistent );
var
  lDest: IStreamPersist;
begin
  if SupportsStreamPersist( Dest, lDest )
  then
    SaveToStreamPersist( lDest )
  else
    inherited;
end;

procedure TStreamData.LoadFromStream( Stream: TStream );
var
  lDest: TStream;
begin
  lDest := GetDataStream( true );
  try
    lDest.CopyFrom( Stream, -1 );
  finally
    lDest.Free;
  end;
end;

procedure TStreamData.LoadFromStreamPersist( const Source: IStreamPersist );
var
  lDest: TStream;
begin
  lDest := GetDataStream( true );
  try
    Source.SaveToStream( lDest );
  finally
    lDest.Free;
  end;
end;

procedure TStreamData.SaveToStream( Stream: TStream );
var
  lSource: TStream;
begin
  lSource := GetDataStream( false );
  try
    Stream.CopyFrom( lSource, -1 );
  finally
    lSource.Free;
  end;
end;

procedure TStreamData.SaveToStreamPersist( const Dest: IStreamPersist );
var
  lSource: TStream;
begin
  lSource := GetDataStream( false );
  try
    Dest.LoadFromStream( lSource );
  finally
    lSource.Free;
  end;
end;

function TStreamData.SupportsStreamPersist( Persistent: TPersistent; var StreamPersist: IStreamPersist ): Boolean;
begin
  Result := Supports( Persistent, IStreamPersist, StreamPersist );
end;

{ TFileStreamData }

constructor TFileStreamData.Create( const FileName: string );
begin
  inherited Create;
  FFileName := ExpandFileName( FileName );
end;

function TFileStreamData.GetDataStream( const Writeable: Boolean ): TStream;
begin
  if Writeable
  then
    begin
      ForceDirectories( ExtractFilePath( FFileName ) );
      Result := TFileStream.Create( FFileName, fmCreate or fmOpenWrite or fmShareDenyRead );
    end
  else
    Result := TFileStream.Create( FFileName, fmOpenRead or fmShareDenyWrite );
end;

end.
Den Blob-Inhalt bekommt man jetzt wie folgt auf die Platte:
Delphi-Quellcode:
procedure foo;
var
  dst: TStreamData;
begin
  dst := TFileStreamData.Create( 'testdaten.rtf' );
  try
    dst.Assign( IrgendeineQuery.FieldByName( 'BlobFeldName' ) );
  finally
    dst.Free;
  end;
end;
Kürzer habe ich es nicht hinbekommen :stupid:

nahpets 17. Mär 2016 08:41

AW: Inhalt eines Blob-Feldes als Datei speichern
 
Wenn ich das richtig sehe, enthält das Blobfeld doch eine RTF-Datei, daher muss / sollte die Dateiendung rtf sein.

Delphi-Quellcode:
advrchdtrMailBody.InsertAsRTF(Signatur);
Könnte es sein, dass durch die Methode InsertAsRTF erst RTF erstellt wird, dass hier also aus dem RTF nochmal RTF gemacht wird und deshalb die Anzeige scheitert, weil das Ergebnis ungültiges RTF wird?

ADVRichEdit ist (in der mir bekannten Version) von TRichEdit abgeleitet. Hier liegt daher die Vermutung nahe, dass das RTF-Dokument einfach in ADVRichEdit.Lines gehört und daher analog zu
Delphi-Quellcode:
jedMailBody.Lines.Add(Signatur);
mit
Delphi-Quellcode:
ADVRichEdit.Lines.Add(Signatur);
zu laden ist?

Uwe Raabe 17. Mär 2016 08:49

AW: Inhalt eines Blob-Feldes als Datei speichern
 
Warum nicht direkt
Delphi-Quellcode:
MyBlobField.SaveToFile(<Dateiname>);
?

Data.DB.TBlobField.SaveToFile

HPB 17. Mär 2016 11:00

AW: Inhalt eines Blob-Feldes als Datei speichern
 
Guten Tag Helfer,
ich habe etwas anderes festgestellt.
Wenn ich den Inhalt des Blobfeldes mit z.B. dem SQL-Manager anschaue, dann wird
der Feldinhalt, egal welche sichtweise (Hex, Text, RichText Image oder HTML)
ich wähle, immer ohne die Grafik angezeigt.
Es stellt sich nun die Frage, wieso wird es in den JediKompo. richtig dargestellt?

Die Tabelle in der gespeichert wird hat nur diesen einen Datensatz.
Hier werden verschiedene Einstellungen gespeichert.
Wenn das Formular geschlossen wird dann wird der Datensatz mit folgendem
gesichert:
Delphi-Quellcode:
  dtmdMain.DoStartTransaction;
  dtmdMain.logendaten.Edit;
  dtmdMain.logendaten.Post;
  dtmdMain.ibtrnsctnLoge.CommitRetaining;
Also ich speichere das Feld Signatur nicht extra.

Vielleicht speichere ich den Datensatz auch falsch ab?
Wenn ich ich das Feld explizit speichern soll, stellt sich mir
die Frage in welchem Format?

Ach so die ADVRichEdit-Kompo kennt nicht
Delphi-Quellcode:
ADVRichEdit.Lines.Add(Signatur)
obwohl sie ja von RichtEdit abgeleitet ist.

Vielleicht hat ja noch jemand einen Rat?
Gruß HPB

HolgerX 17. Mär 2016 17:32

AW: Inhalt eines Blob-Feldes als Datei speichern
 
Hmmm..

Zitat:

Zitat von nahpets (Beitrag 1333105)
...
ADVRichEdit ist (in der mir bekannten Version) von TRichEdit abgeleitet.
...

Wenn ADVRichEdit wirklich von TRichEdit abgeleitet ist, dann kann das mit dem Image nichts werden, da TRichEdit in Delphi meinetwissens keine Images einbetten/anzeigen kann...

Such mal hier im Forum nach TRichEdit und Images...


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:15 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