![]() |
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:
Jedoch wird nichts angezeigt.
advrchdtrMailBody.InsertAsRTF(Signatur);
Wenn ich das Blob-Feld jedoch in einer JVRichedit-Komponente einfüge:
Delphi-Quellcode:
Wird alles korrekt angezeigt. Siehe auch den Anhang.
jedMailBody.Lines.Add(Signatur);
Nach Rücksprache mit TMS möchte Bruno Fierens nun den Inhalt des Blobfeldes als Datei haben. Zitat:
Mit Gruß HPB |
AW: Inhalt eines Blob-Feldes als Datei speichern
Hilft Dir das?
![]() Oder das? ![]() |
AW: Inhalt eines Blob-Feldes als Datei speichern
Und als Dateiendung würde ich .rtf nehmen.
|
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:
Den Blob-Inhalt bekommt man jetzt wie folgt auf die Platte:
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.
Delphi-Quellcode:
Kürzer habe ich es nicht hinbekommen :stupid:
procedure foo;
var dst: TStreamData; begin dst := TFileStreamData.Create( 'testdaten.rtf' ); try dst.Assign( IrgendeineQuery.FieldByName( 'BlobFeldName' ) ); finally dst.Free; end; end; |
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:
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?
advrchdtrMailBody.InsertAsRTF(Signatur);
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:
mit
jedMailBody.Lines.Add(Signatur);
Delphi-Quellcode:
zu laden ist?
ADVRichEdit.Lines.Add(Signatur);
|
AW: Inhalt eines Blob-Feldes als Datei speichern
Warum nicht direkt
Delphi-Quellcode:
?
MyBlobField.SaveToFile(<Dateiname>);
![]() |
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:
Also ich speichere das Feld Signatur nicht extra.
dtmdMain.DoStartTransaction;
dtmdMain.logendaten.Edit; dtmdMain.logendaten.Post; dtmdMain.ibtrnsctnLoge.CommitRetaining; 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:
obwohl sie ja von RichtEdit abgeleitet ist.
ADVRichEdit.Lines.Add(Signatur)
Vielleicht hat ja noch jemand einen Rat? Gruß HPB |
AW: Inhalt eines Blob-Feldes als Datei speichern
Hmmm..
Zitat:
Such mal hier im Forum nach TRichEdit und Images... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:51 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