如何从PostgreSQL数据库中获取图片

本文关键字:获取 取图片 数据库 PostgreSQL | 更新日期: 2023-09-27 17:55:21

我想选择一张在PostgreSQL数据库中另存为大对象的图片。

我知道我用lo_export来做到这一点。

但是有一个问题:我想将此图片直接保存到我的计算机上,因为我无法使用lo_export访问保存在服务器上的文件

(我认为如果图片通过选择查询传输到我的计算机,这对我来说是最好的)

如何从PostgreSQL数据库中获取图片

我不完全了解 C# 的方法,但 Npgsql 手册有一个类似于将bytea列写入文件的示例:

command = new NpgsqlCommand("select blob from t where id = 1);", conn);
Byte[] result = (Byte[])command.ExecuteScalar();
FileStream fs = new FileStream(args[0] + "database", FileMode.Create, FileAccess.Write);
BinaryWriter bw = new BinaryWriter(new BufferedStream(fs));
bw.Write(result);
bw.Flush();
fs.Close();
bw.Close();

因此,您只需像任何其他列一样将其从数据库中读取出来,然后将其写入本地文件。这个例子大约在我链接到的页面的一半,只需搜索"bytea",你就会找到它。

更新:对于大型对象,该过程似乎类似,但不太像 SQL。手册(如上面链接的)包括一些大型对象示例:

NpgsqlTransaction t = Polacz.BeginTransaction();
LargeObjectManager lbm = new LargeObjectManager(Polacz);
LargeObject lo = lbm.Open(takeOID(idtowaru),LargeObjectManager.READWRITE); //take picture oid from metod takeOID
byte[] buf = new byte[lo.Size()];
buf = lo.Read(lo.Size());
MemoryStream ms = new MemoryStream();
ms.Write(buf,0,lo.Size());
// ...
Image zdjecie = Image.FromStream(ms);

在手册中搜索"大物体",你会找到它。

不熟悉 C#,但如果你有 contrib/dblink 并且更好地访问单独的 postgresql 服务器,这可能会起作用:

  1. 从坏数据库服务器中选择大对象。
  2. 使用 dblink 将大对象复制到良好的数据库服务器中。
  3. lo_export在良好的数据库服务器上。

如果您的图片不超过 1GB(或者您不只访问部分字节),那么使用 bytea 是存储它们的更好选择。

许多SQL GUI工具允许直接下载(甚至查看)bytea列的内容