AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Inhalt eines Blob-Feldes als Datei speichern
Thema durchsuchen
Ansicht
Themen-Optionen

Inhalt eines Blob-Feldes als Datei speichern

Ein Thema von HPB · begonnen am 17. Mär 2016 · letzter Beitrag vom 17. Mär 2016
Antwort Antwort
HPB

Registriert seit: 2. Jun 2008
365 Beiträge
 
Delphi XE7 Professional
 
#1

Inhalt eines Blob-Feldes als Datei speichern

  Alt 17. Mär 2016, 08:39
Datenbank: Interbase • Version: XE2 • Zugriff über: IB
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:
advrchdtrMailBody.InsertAsRTF(Signatur); Jedoch wird nichts angezeigt.

Wenn ich das Blob-Feld jedoch in einer JVRichedit-Komponente einfüge:
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
Miniaturansicht angehängter Grafiken
tms-richedit-1.png  
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#2

AW: Inhalt eines Blob-Feldes als Datei speichern

  Alt 17. Mär 2016, 09:18
Hilft Dir das? http://www.scalabium.com/faq/dct0141.htm
Oder das? http://stackoverflow.com/questions/1...using-firebird
  Mit Zitat antworten Zitat
Benutzerbild von baumina
baumina

Registriert seit: 5. Mai 2008
Ort: Oberschwaben
1.275 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Inhalt eines Blob-Feldes als Datei speichern

  Alt 17. Mär 2016, 09:22
Und als Dateiendung würde ich .rtf nehmen.
Hinter dir gehts abwärts und vor dir steil bergauf ! (Wolfgang Ambros)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Inhalt eines Blob-Feldes als Datei speichern

  Alt 17. Mär 2016, 09:27
Ich tippe mal darauf, dass sich in dem Blob-Feld RichText befindet.

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

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
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#5

AW: Inhalt eines Blob-Feldes als Datei speichern

  Alt 17. Mär 2016, 09:41
Wenn ich das richtig sehe, enthält das Blobfeld doch eine RTF-Datei, daher muss / sollte die Dateiendung rtf sein.

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 jedMailBody.Lines.Add(Signatur); mit ADVRichEdit.Lines.Add(Signatur); zu laden ist?
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#6

AW: Inhalt eines Blob-Feldes als Datei speichern

  Alt 17. Mär 2016, 09:49
Warum nicht direkt MyBlobField.SaveToFile(<Dateiname>); ?

Data.DB.TBlobField.SaveToFile
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
HPB

Registriert seit: 2. Jun 2008
365 Beiträge
 
Delphi XE7 Professional
 
#7

AW: Inhalt eines Blob-Feldes als Datei speichern

  Alt 17. Mär 2016, 12:00
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
ADVRichEdit.Lines.Add(Signatur) obwohl sie ja von RichtEdit abgeleitet ist.

Vielleicht hat ja noch jemand einen Rat?
Gruß HPB
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
972 Beiträge
 
Delphi 6 Professional
 
#8

AW: Inhalt eines Blob-Feldes als Datei speichern

  Alt 17. Mär 2016, 18:32
Hmmm..

...
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...
  Mit Zitat antworten Zitat
Antwort Antwort


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 03:55 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