0

我在检索包含图像的 blob 字段时遇到问题,然后将其保存到文件中。
下载的文件格式似乎不正确;如果我用十六进制编辑器打开它,它包含单词@R_BLOB@

有什么问题?

bg: = TAdsBlobStream.Create (adsQuery1.FieldByName ('PAGE') as TBlobField, bmReadWrite);
f: = TMemoryStream.create;
bg.Position: = 0;
f.CopyFrom (bg, bg.size);
f.SaveToFile ('c: \ tmp \ db \ img \' + IntToStr (n) + '. jpg');
f.free;

谢谢

4

2 回答 2

2

我只是使用以下代码通过 ADSTable 将一个小的 (9K) JPEG 写入 ADS BLOB 字段,将其读回 ADSBlobStream 并将其写入单独位置的磁盘,一切正常。图像的新副本在 Windows 图片查看器中可以正常打开,并且我在使用十六进制查看器时看不到任何无关字符。

// Code to create the test table, done in ARC32
CREATE TABLE Test (ID Integer, Pic BLOB);

在新的空白 VCL 表单上删除了TADSSettingsTADSQuery和两个普通组件。TButton这是按钮 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以将其读回并将其写入磁盘上的新文件。

于 2013-06-21T12:58:44.720 回答
0

初始文本@R_BLOB@ 取决于组件TadsQuery 的属性TableType 中设置的表类型,将其设置为ttAdsCDX,导出工作。

谢谢大家。

于 2013-06-26T06:51:48.010 回答