如何使用PHP将PostgreSQL Bytea值转换为数据URL值



PostgreSQL具有此数据类型,称为bytea。这是他们的版本 blob

在显示图像,png/jpg/gif时,当前的趋势是使用数据URL

我的问题是如何将BYTEA值转换为基本64数据URL值?

参考

  • bytea-二进制数据类型。PostgreSQL 9.6文档
  • 数据URL-将图像复制为Umar Hansa的数据URI。Google开发人员。2015年5月

您也可以从数据库中获取完整的图像数据URL,例如:

SELECT 'data:image/gif;base64,' || encode(image_data, 'base64') AS image_url 
FROM ...  
$img_bin = hex2bin(substr($the_bytea, 2));
$url = 'data:image/gif;base64,' . base64_encode($img_bin);

Postgres bytea是一个从x开始的字符串,然后是十六进制字符。要以二进制格式获取图像,需要剥离领先的x,并从十六进制字符转换为使用hex2bin的二进制字符。现在您将其放在二进制中,可以base64_encode

发布此答案,而不是使用Postgres和sqlalchemy在此处偶然发现的任何人。感谢您帮助我走这么远的其他答案。

我能够使用上面的Clemens提供的答案,并将SQL放入column_property并利用Lirtal_column插入RAWSQL语句。

class Attachment(BaseModel):
    __tablename__ = "attachments"
    id = Column(UUID(), primary_key=True, default=uuid.uuid4, )
    data = Column(BYTEA(), nullable=True)
    text = Column(Text, nullable=True)
    file_name = Column(String(255), nullable=True)
    content_type = Column(String(255), nullable=True)
    model = Column(String(255), nullable=False)
    model_id = Column(UUID(), nullable=False, index=True)
    meta_data = Column(JSON, nullable=True)
    deleted = Column(BOOLEAN, default=False)
    # return a data url when the attachment is an image, doesnt work in sqlite
    image_url = column_property(
        literal_column("""
            CASE
                WHEN content_type LIKE 'image%' THEN 'data:image/gif;base64,' || encode(data, 'base64')
                ELSE null
            END
            """, type_=String).label("image_url")
    )

最新更新