Also ich speichere meine Dokumente in einem Firebird-Blob so:
Delphi-Quellcode:
Function TDatMod.DateiToBlob(Datei: String; Blobfeld: TField): Boolean;
VAR
S : TStream;
FileS : TFileStream;
begin
Result := FALSE;
S := BlobFeld.DataSet.CreateBlobStream(BlobFeld, bmReadWrite);
TRY
FileS := TFileStream.Create(Datei, fmOpenRead);
S.CopyFrom(FileS, FileS.Size);
Result := TRUE;
FINALLY
FileS.Free;
S.Free;
END;
end;
Übergeben wird einfach der Dateiname und das Blobfeld. Zuvor wird natürlich der Datensatz zum Editieren vorbereitet, und auch das Post erfolgt nicht in der Funktion. Die erledigt nur das reine Einlesen einer Datei in ein Blobfeld.
Um eine im Blob gespeicherte PDF- oder
HTML-Datei im Embedded WebBrowser anzuzeigen, gehe ich z.B. so vor:
Delphi-Quellcode:
procedure TFormDoku.DokumentLaden;
Var
PersistStreamInit : IPersistStreamInit;
StreamAdapter : IStream;
MemoryStream : TMemoryStream;
Stream : TStream;
Blobfeld : TField;
begin
Blobfeld := DatMod.Qset_NewsLink.FieldByName('
INHALT');
Stream := BlobFeld.DataSet.CreateBlobStream(BlobFeld, bmRead);
EmbWeb.Navigate('
about:blank');
// Leeres HTML-Dokument in Browser laden um ein valites HTML-Dokument zu erzeugen
// wait until finished loading
Repeat
Application.ProcessMessages;
Sleep(0);
Until EmbWeb.ReadyState = READYSTATE_COMPLETE;
// Get IPersistStreamInit - Interface
IF EmbWeb.Document.QueryInterface(IPersistStreamInit, PersistStreamInit) = S_OK
THEN
BEGIN
IF PersistStreamInit.InitNew = S_OK
THEN // Clear document
BEGIN
// Make local copy of the contents of Stream if you want to use Stream directly, you have to
// consider, that StreamAdapter will destroy it automatically
MemoryStream:= TMemoryStream.Create;
Try
MemoryStream.CopyFrom(Stream, 0);
MemoryStream.Position:= 0;
Except
FreeAndNil(MemoryStream);
Raise;
End;
StreamAdapter:= TStreamAdapter.Create(MemoryStream, soOwned);
// Use Stream-Adapter to get IStream Interface to our stream
PersistStreamInit.Load(StreamAdapter);
// Load data from Stream into WebBrowser
END;
END;
IF Assigned(Stream)
THEN FreeAndNil(Stream);
IF Assigned(Blobfeld)
THEN FreeAndNil(Blobfeld);
end;