Xml 如何在来自BYTEA的PostgreSQL数据库中编码JPG图像

Xml 如何在来自BYTEA的PostgreSQL数据库中编码JPG图像,xml,postgresql,Xml,Postgresql,因此,我将一些JPG图像存储在PostgreSQL数据库表中的BYTEA列中。我想提取二进制文件并将其放入标记中。这是其中一个文件的第一部分 这个二进制数据非常符合我在实际图像文件中看到的内容(使用Vim的“Convert to HEX”) 但当我尝试将其编码为base64(这样我就可以通过XSLT将数据包含在网页中)时,它似乎被破坏了。下面是我的查询中的一个片段 mydb=# SELECT LEFT(encode(image_file, 'escape'), 80) FROM image_f

因此,我将一些JPG图像存储在PostgreSQL数据库表中的
BYTEA
列中。我想提取二进制文件并将其放入
标记中。这是其中一个文件的第一部分

这个二进制数据非常符合我在实际图像文件中看到的内容(使用Vim的“Convert to HEX”)

但当我尝试将其编码为
base64
(这样我就可以通过XSLT将数据包含在网页中)时,它似乎被破坏了。下面是我的查询中的一个片段

mydb=# SELECT LEFT(encode(image_file, 'escape'), 80) FROM image_files WHERE id = '53';                                                                         
                                       left
----------------------------------------------------------------------------------
 x/ffd8ffe000104a46494600010100000100010000ffdb004300100b0c0e0c0a100e0d0e12111013
(1 row)
在HTML中,我看到

xmlelement(NAME "pictures",
    xmlagg(
        xmlelement(NAME "src", CONCAT('data:image/jpg;base64,', encode(image_file, 'base64')))
    )
)
所以我想知道,当PG试图将十六进制字节数组编码为
base64
时,它是否也会在字节数组中看到“
x/
”,这会使它失效?但我不能,为了我的生命,找出如何在查询中纠正这一点


我相信这是每天都会发生的事情,不应该让我在近一周的时间里挠头!如果我遗漏了任何内容,或者需要任何版本信息,请告诉我。

任何将您的文件首先保存到数据库中的内容都会使它们出错。它们可能被保存在bytea列中,但实际上是存储十六进制数字的文本数据,在前面添加了两个文本字符
x
/
,这两个字符是无用的,也是误导性的。所以有些东西对二进制进行了十六进制编码,但随后存储了十六进制编码的字符串,就好像它仍然是二进制的一样

您需要切掉前2个字节,然后将结果字符串从bytea转换回文本。然后将包含十六进制数字的文本转换为实二进制,并返回base64

mydb=# SELECT encode('\xffd8ffe000104a46494600010100000100010000ffdb004300100b0c0e0c0a100e0d0e12111013', 'base64');  
                        encode
------------------------------------------------------
 /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDABALDA4MChAODQ4SERAT
(1 row)
(实际上,您也可以在子字符串之前对文本进行强制转换)


但与其每次都进行这种转换,不如重构表以保存更合理的数据。“更合理”是指存储在bytea列中的bytea数据,或者(如果您专门想处理base64)存储在文本列中的base64数据。

任何首先将文件保存到数据库中的东西都会把它们搞砸。它们可能被保存在bytea列中,但实际上是存储十六进制数字的文本数据,在前面添加了两个文本字符
x
/
,这两个字符是无用的,也是误导性的。所以有些东西对二进制进行了十六进制编码,但随后存储了十六进制编码的字符串,就好像它仍然是二进制的一样

您需要切掉前2个字节,然后将结果字符串从bytea转换回文本。然后将包含十六进制数字的文本转换为实二进制,并返回base64

mydb=# SELECT encode('\xffd8ffe000104a46494600010100000100010000ffdb004300100b0c0e0c0a100e0d0e12111013', 'base64');  
                        encode
------------------------------------------------------
 /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDABALDA4MChAODQ4SERAT
(1 row)
(实际上,您也可以在子字符串之前对文本进行强制转换)


但与其每次都进行这种转换,不如重构表以保存更合理的数据。“更合理”是指存储在bytea列中的bytea数据,或者(如果您只想处理base64)存储在文本列中的base64数据。

这听起来是一个非常合理的解释。非常感谢!我已经盯着这个问题看了一个多星期了,老实说,这是我第一次看到或听到的常识!早上我会和一个给我提供图像的家伙说一句客气话,他建议他对数据应用更少的工程…我从
decode()
中得到以下错误:
错误:无效的十六进制数字:“\”SQL状态:22023
。有线索吗?我找到了!所需的转换是
encode(CONCAT('\x',子字符串(encode(image_文件,'escape'),3))::BYTEA,'base64')
。糟透了,但现在还有效,直到另一个人的结局得到解决。再次感谢您为我指明了正确的方向。看起来并不是所有的行都遵循相同的模式。你能告诉我造成这种情况的具体数值吗?这听起来很有道理。非常感谢!我已经盯着这个问题看了一个多星期了,老实说,这是我第一次看到或听到的常识!早上我会和一个给我提供图像的家伙说一句客气话,他建议他对数据应用更少的工程…我从
decode()
中得到以下错误:
错误:无效的十六进制数字:“\”SQL状态:22023
。有线索吗?我找到了!所需的转换是
encode(CONCAT('\x',子字符串(encode(image_文件,'escape'),3))::BYTEA,'base64')
。糟透了,但现在还有效,直到另一个人的结局得到解决。再次感谢您为我指明了正确的方向。看起来并不是所有的行都遵循相同的模式。你能告诉我造成这种情况的具体数值吗?
mydb=# SELECT encode('\xffd8ffe000104a46494600010100000100010000ffdb004300100b0c0e0c0a100e0d0e12111013', 'base64');  
                        encode
------------------------------------------------------
 /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDABALDA4MChAODQ4SERAT
(1 row)
SELECT encode(decode(substring(image_file,3)::text,'hex'),'base64') FROM image_file WHERE id = whatever;