我试图在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转换为图像?
更新
ÿØÿà
个字符是0xFF 0xD8 0xFF 0xE0
,它们确实是JPEG文件的开头。我使用通过Mapbox iOS SDK在iOS应用程序中使用的相同MBTile文件,因此文件没有损坏,我实际上可以使用SQLite GUI查看BLOB图像。 MBTiles规范说该字段是BLOB类型,实际上,这是我正在使用的字段类型。
同样,数据库很好,与外部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个字节。
更新2:
这是tiles表的一个特定记录的输出。请注意,tile_data
字段是BLOB,GUI底部显示4个字符。这是我在Go代码中在[]byte
数组中收到的确切内容。
所以我的问题是:我的数据库中有这个BLOB图像文件,这是一个jpeg图像。我如何阅读它并将其显示为我的网页中的图像?我想读取BLOB并在我的http请求中返回一个图像。
Tiles row sample:
平铺字段类型
答案 0 :(得分:1)
这是sqlite3驱动程序中的一个错误。它没有正确处理包含NUL字符的字符串。现在已修复。
此外,数据尚未正确插入数据库。它们的数据类型是TEXT,而不是模式所需的BLOB。您可以在sqlite shell中看到:SELECT typeof(tile_data) FROM tiles;
。 1