我正在尝试在Go中创建一个mbtiles服务器 . 该文件遵循mbtiles spec . tile_data
字段是 BLOB
,我正在尝试查询数据库并获取相应的图像(存储为blob类型) .
到目前为止,查询还可以,但我的结果已经损坏 tile_data
. 我不确定如何将SQLite BLOB映射到正确的Go数据结构 .
到目前为止,我尝试在github gombtiles sample之后使用 var tileData []byte
但没有成功 . 返回值得到一个只有4个字节的数组,我怀疑它是真的,因为当我在SQLite GUI中看到BLOB为Text类型时它也会得到4个字符(类似于 ÿØÿà
)
总结一下: tile_data
是一个BLOB(存储图像),我无法正确转换为Go var . 如何在Go中将BLOB转换为Image?
UPDATE:
ÿØÿà
字符是 0xFF 0xD8 0xFF 0xE0
,它们确实是JPEG文件的开头 . 我已经损坏了,我可以使用SQLite GUI实际看到BLOB图像 . MBTiles规范说该字段是BLOB类型,实际上,'s the field type that i' m使用 . 同样,数据库很好,与外部iOS应用程序使用的数据库相同 . 我甚至可以成功查询其他数据 .
对于上下文,这是我的孤立代码 .
func TilesHandler(w http.ResponseWriter, r *http.Request) {
db, _ := sql.Open("sqlite3", "./mapSource.mbtiles")
defer db.Close()
rows, _ := db.Query("SELECT tile_data FROM tiles WHERE zoom_level = 10 AND tile_column = 309 AND tile_row = 569")
defer rows.Close()
var tileData []byte
for rows.Next() {
rows.Scan(&tileData)
}
w.Write(tileData)
}
为简单起见,缩放和坐标是硬编码的 . tiledata
返回上述4个字节 .
UPDATE 2: 这是tiles表的一个特定记录的输出 . 请注意, tile_data
字段是BLOB,GUI底部显示4个字符 . 这是我在Go代码中在 []byte
数组中收到的确切内容 .
So my question is: 我的数据库中有这个BLOB图像文件,它是一个jpeg图像 . 我如何阅读它并将其显示为我的网页中的图像?我想读取BLOB并在我的http请求中返回一个图像 .
Tiles row sample:
Tiles fields types
1 回答
这是sqlite3驱动程序中的一个错误 . 它没有正确处理包含NUL字符的字符串 . 它现在已修复 .
此外,数据尚未正确插入数据库 . 它们的数据类型是TEXT,而不是模式所需的BLOB . 你可以在sqlite shell中看到这个:
SELECT typeof(tile_data) FROM tiles;
. 1