发送为base64并保存为字节oid

时间:2018-10-09 12:05:51

标签: database postgresql

我尝试编写脚本以将某些文件保存到具有OID(字节[])的表中 我发现lo_import,但这并不是我想要的。我想设置base64而不是文件路径。有什么不同的方法吗?如果您听不懂->

我不想要的东西

INSERT INTO table VALUES (lo_import('path'))

我想要什么

INSERT INTO table VALUES (lo_import('base64 (maybe something else)'))

1 个答案:

答案 0 :(得分:0)

您可以编写一个函数(这是仅服务器端的解决方案)

CREATE OR REPLACE FUNCTION lo_import_bytea(path text)
RETURNS bytea AS $$
DECLARE
  loid oid;
  result bytea;
BEGIN
  loid := lo_import(path);
  result := lo_get(loid);
  PERFORM lo_unlink(loid);
  RETURN result;
END;
$$ LANGUAGE plpgsql;

注意-只有超级用户可以使用lo_import功能,因为该功能可以访问服务器端的文件系统。因此,此函数可能应该是SECURITY DEFINER类型。在这种情况下,此功能可能是安全漏洞,可能某种形式的路径白名单可能是个好主意。

通常的方法是使用libpq(客户端库)函数lo_import,该函数返回导入对象的oid。该oid可用作函数lo_get的参数。此函数将LO对象转换为字节类型。转换后的值可以插入表中。之后,可以删除由oid描述的LO对象。