如何使用golang将Microsoft SQL varbinary(max)字段提取到图像?

时间:2018-09-20 13:57:30

标签: sql-server go

我在Microsoft SQL Server中有一个varbinary(max)字段,其中包含一个图像。

运行“从表中选择图像”时,得到的结果看起来像是“ 0x07FD30 ....”

使用go检索数据时,我得到的十六进制字符串存储为[] byte:

type Person struct {
    PersonID string
    Image    []byte
} 

我连接到数据库并执行以下操作:

rows.Scan(&person.PersonID, &person.Image)

然后将结果打印为十六进制,相同:

fmt.Printf("%#x", p.Image)

结果:

0x07fd30...

我的问题是,如何将其转换为图像?

我尝试将原始字节写入文件:

ioutil.WriteFile("./tempfile.png", p.Image, 0644)

我尝试使用图片库对其进行解码,只是出现了一种不明类型的错误:

image.Decode(bytes.NewReader(p.Image))

还尝试了png.Encode

任何朝着正确方向的想法或指示都将受到赞赏。

非常感谢。

2 个答案:

答案 0 :(得分:1)

Darren是正确的,因为总是通过AX将前7个字节添加到图像文件中,即07FD3097F90000。 不幸的是,似乎AX还在二进制文件的末尾添加了其他信息。我还没有弄清楚它的确切模式,但是通常情况下,如果上传的图像相对较小,并且其高度小于宽度,则AX只会在末尾添加FF,否则会对它进行大量更改文件。

在您的情况下,如果您只对存储在SQL Server中的一个特定映像感兴趣,请查看二进制文件并查看其是否以FF结尾。如果是,请剥离多余的字节,然后将其转换为base64以显示它。

答案 1 :(得分:0)

使用ioutil.WriteFile("./tempfile.png", p.Image, 0644)将原始字节写入文件似乎是正确的过程。但是,无论出于何种原因,Microsoft Dynamics AX 2012似乎都使用其BinData类将其保存到数据库时在文件的开头添加了额外的7个字节。因此,使用ioutil.WriteFile(s, p.Image[7:], 0644)是可行的。我想了解这7个字节是什么以及它们的用途,但是那是另一天的事情。谢谢。