PostgreSQL加载图像到数据库

3

我已经知道如何将图片存储在数据库中,只需在我的表中使用 bytea 类型。

而且,我已经可以通过我的 .net Core 项目中的代码将图像保存到数据库中。我只是通过 url 获取图像并像这样保存:

using (HttpResponseMessage res = await client.GetAsync(photo_url))
  using (HttpContent content = res.Content) {
    byte[] imageByte = await content.ReadAsByteArrayAsync();
     using (NpgsqlConnection conn = new NpgsqlConnection("ConnectionString")) {
      conn.Open();
      using (NpgsqlTransaction tran = conn.BeginTransaction())
      using (NpgsqlCommand cmd = new NpgsqlCommand("Photo_Save", conn)) {           
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.AddWithValue("photo", NpgsqlTypes.NpgsqlDbType.Bytea, imageByte);
        cmd.ExecuteScalar();           
        tran.Commit();
  }
}

它运行良好

但我需要将来自我的电脑的图像保存到表中

是否有一种方法可以将图像上传到数据库,而不需要在主机上或任何其他项目中编写代码,只需使用本地图片和连接到Postges DB?


你看过https://dev59.com/DWEh5IYBdhLWcg3wjEDn#46314519?noredirect=1#comment93152073_46314519吗? - Ravi
1
@Ravi 你看到这个问题是什么时候被问的了吗? :) - Igor Cova
1
是的,我刚刚看到了。如果我在七月份看到这个问题,我会在2018年7月16日回答的。很抱歉回答晚了,之前我没有看到过这个问题。请谅解。 - Ravi
2个回答

5

如果您能使用psql,您可以使用\lo_import导入图像,并使用lo_openloread函数将内容读取为bytea

假设我想将文件chuck.jpg导入到表格blobs中,并且该文件大小不超过1000000字节,则可以按如下方式操作:

test=> \lo_import chuck.jpg 
lo_import 152237

test=> INSERT INTO blobs VALUES (1, loread(lo_open(152237, 131072), 1000000));
INSERT 0 1

test=> \lo_unlink 152237
lo_unlink 152237

我使用\lo_unlink来删除临时大对象。

图像文件位于运行psql的客户端机器上。导入该图像的服务器可以在任何地方。 - Laurenz Albe
这真的是我期望的 - 很好。我在Win10上使用PgAdmin - 我找不到win10的psql工具 - 你能分享一下链接吗? - Igor Cova
不,我没有。只安装在主机上。好的 - 我能只安装 psql 而不安装 PostgreSQL 吗? - Igor Cova
我不知道。这取决于安装方法。 - Laurenz Albe
我在那里找到了解决方案:https://dev59.com/UlsX5IYBdhLWcg3wae1x - Igor Cova
显示剩余2条评论

0
假设以下方案用于图像:
CREATE TABLE images (
  owner_id uuid references users(user_id), 
  image_id uuid primary key,
  added_timestamp timestamp with time zone,
  img bytea
);

这个可以更顺畅地完成同样的事情,而且不需要安装任何二进制文件(在我的情况下,直接从pgAdmin与Postgresql 11一起使用)

create or replace function img_import(filename text)
  returns void
  volatile
  as $$
    declare
        content_ bytea;
        loid oid;
        lfd integer;
        lsize integer;
    begin
        loid := lo_import(filename);
        lfd := lo_open(loid,131072);
        lsize := lo_lseek(lfd,0,2);
        perform lo_lseek(lfd,0,0);
        content_ := loread(lfd,lsize);
        perform lo_close(lfd);
        perform lo_unlink(loid);

    insert into images values
    (uuid('66032153-0afc-4124-a50a-c4ea386f4684'), 
    uuid_generate_v4(),
    now(),
    content_);
    end;
$$ language plpgsql

感谢this源代码的作者(用于导入XML的函数)。

另外,正如其他答案所指出的那样,lo_open(loid,131072);可以根据需要进行调整以适应某些最大尺寸。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接