я использовал следующий код, чтобы написать небольшой (9K) JPEG в качестве ADS BLOB поля через ADSTable, читать его обратно в ADSBlobStream и записать его на диск в отдельном месте , и все работало нормально. Новая копия изображения отлично открывается в Windows Picture Viewer, и я не вижу в ней никаких посторонних символов с шестнадцатеричным просмотром.
// Code to create the test table, done in ARC32
CREATE TABLE Test (ID Integer, Pic BLOB);
уронил TADSSettings
, TADSQuery
, и две простые TButton
компоненты на новом бланке VCL. Вот кнопка OnClick обработчики (очевидно, имена файлов в обоих обработчиков жестко закодированы и должен быть заменен на фактические имена файлов на вашем компьютере):
procedure TForm1.Button1Click(Sender: TObject);
var
Blob: TAdsBlobStream;
Strm: TFileStream;
Tbl: TAdsTable;
begin
Tbl := TAdsTable .Create(nil);
try
Tbl.DatabaseName := AdsQuery1.DatabaseName;
Tbl.TableType := ttAdsCDX;
Tbl.TableName := 'Test.dbf';
Tbl.Open;
Tbl.Edit;
Blob := Tbl.CreateBlobStream(AdsQuery1.Fields[1], bmWrite) as TAdsBlobStream;
try
Strm := TFileStream.Create('E:\Test\Images\Big folder.jpg', fmOpenRead);
try
Blob.CopyFrom(Strm, Strm.Size);
finally
Strm.Free;
end;
finally
Blob.Free;
end;
finally
Tbl.Post;
Tbl.Close;
Tbl.Free;
AdsQuery1.Open;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
Blob: TAdsBlobStream;
Strm: TFileStream;
begin
AdsQuery1.SQL.Text := 'SELECT ID, pic FROM test';
AdsQuery1.Open;
Blob := AdsQuery1.CreateBlobStream(AdsQuery1.Fields[1], bmRead) as TAdsBlobStream;
try
Strm := TFileStream.Create('E:\TempFiles\BigFolder.jpg', fmCreate);
try
Strm.CopyFrom(Blob, Blob.Size);
finally
Strm.Free;
end;
finally
Blob.Free;
end;
end;
Запустите приложение и нажмите Button1
, чтобы вставить изображение в Test
Таблица. Затем нажмите Button2
, чтобы прочитать его и записать в новый файл на диске.
Попробуйте 'f: = TFileStream.Create ('c: \ tmp \ db \ img \ 000.jpg', fmOpenWrite); попробуйте f.Seek (0, soFromBeginning); f.CopyFrom (bg, 0); наконец, f.free; end; 'http://www.freepascal.org/docs-html/rtl/classes/tfilestream.create.html Существует мало резона, чтобы сделать промежуточный буфер RAM для этого. –
Ну, на самом деле это все еще избыточно. Почему бы не сделать прямой 'bg.SavetoFile ('c: \ tmp \ db \ img \ 000.jpg');'? –
, если вы читаете http://www.sybase.com/files/White_Papers/SY-Advantage-Delphi-Getting-Started-Guide-080409-WP.pdf, вы также найдете '(adsQuery1.FieldByName ('PAGE') как TBlobField) .SavetoFile ('c: \ tmp \ db \ img \ 000.jpg'); ' –