如何使用 PHP 将 PostgreSQL bytea 值转换为 Data URL 值

问题描述 投票:0回答:3

PostgreSQL 有一种称为

bytea
的数据类型。这是他们的 blob 版本。

在显示图像,png/jpg/gif时,当前的趋势是使用Data URLs

我的问题是如何将 bytea 值转换为 Base64 Data URL 值?

参考文献

php postgresql data-uri bytea
3个回答
6
投票

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

SELECT 'data:image/gif;base64,' || encode(image_data, 'base64') AS image_url 
FROM ...  

1
投票
$img_bin = hex2bin(substr($the_bytea, 2));
$url = 'data:image/gif;base64,' . base64_encode($img_bin);

Postgres bytea 是一个以

\x
开头,后跟十六进制字符的字符串。要获取二进制格式的图像,需要去掉前导的
\x
并使用
hex2bin
将十六进制字符转换为二进制。现在您已经有了二进制文件,您可以
base64_encode
它。


0
投票

发布此答案,以防有人在使用 Postgres 和 sqlalchemy 时遇到问题。感谢其他答案帮助我走到这一步。

我能够使用上面 clemens 提供的答案,并将 sql 放入 column_property 中,并利用literal_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")
    )
© www.soinside.com 2019 - 2024. All rights reserved.