如何向golang提供mongodb的文件
我正在一个go项目中工作,我需要为存储在mongodb中的文件提供服务。这些文件存储在GridFs中。我使用gopkg.in/mgo.v2作为包来连接和查询数据库 我可以从数据库中检索文件,这并不难如何向golang提供mongodb的文件,mongodb,go,gridfs,fileserver,Mongodb,Go,Gridfs,Fileserver,我正在一个go项目中工作,我需要为存储在mongodb中的文件提供服务。这些文件存储在GridFs中。我使用gopkg.in/mgo.v2作为包来连接和查询数据库 我可以从数据库中检索文件,这并不难 f, err := s.files.OpenId(id) 但是我如何使用http为该文件提供服务? 我与JulienSchmidt路由器一起处理所有其他restfull请求。 我找到的解决方案总是使用静态文件,而不是数据库中的文件 提前感谢提示:建议使用而不是使用gopkg.in/mgo.v2(后
f, err := s.files.OpenId(id)
但是我如何使用http为该文件提供服务?
我与JulienSchmidt路由器一起处理所有其他restfull请求。
我找到的解决方案总是使用静态文件,而不是数据库中的文件
提前感谢提示:建议使用而不是使用gopkg.in/mgo.v2
(后者不再维护)
类型实现,因此您可以使用将其内容复制到 但是由于
mgo.GridFile
也实现了,您可以利用。引用其文件:
io.Copy上的ServeContent的主要好处是,它可以正确处理范围请求,设置MIME类型,并处理是否匹配、是否未修改自、是否不匹配、是否修改自以及范围请求
为文件提供服务的示例处理程序:
func serveFromDB(w http.ResponseWriter, r *http.Request) {
var gridfs *mgo.GridFS // Obtain GridFS via Database.GridFS(prefix)
name := "somefile.pdf"
f, err := gridfs.Open(name)
if err != nil {
log.Printf("Failed to open %s: %v", name, err)
http.Error(w, "something went wrong", http.StatusInternalServerError)
return
}
defer f.Close()
http.ServeContent(w, r, name, time.Now(), f) // Use proper last mod time
}
提示:建议使用而不是gopkg.in/mgo.v2
(后者不再维护)
类型实现,因此您可以使用将其内容复制到 但是由于
mgo.GridFile
也实现了,您可以利用。引用其文件:
io.Copy上的ServeContent的主要好处是,它可以正确处理范围请求,设置MIME类型,并处理是否匹配、是否未修改自、是否不匹配、是否修改自以及范围请求
为文件提供服务的示例处理程序:
func serveFromDB(w http.ResponseWriter, r *http.Request) {
var gridfs *mgo.GridFS // Obtain GridFS via Database.GridFS(prefix)
name := "somefile.pdf"
f, err := gridfs.Open(name)
if err != nil {
log.Printf("Failed to open %s: %v", name, err)
http.Error(w, "something went wrong", http.StatusInternalServerError)
return
}
defer f.Close()
http.ServeContent(w, r, name, time.Now(), f) // Use proper last mod time
}
它很旧,但我通过导入goMongo驱动程序获得了另一个解决方案
“go.mongodb.org/mongo-driver/mongo/gridfs”
//下面的代码用于读取文件
fileBuffer := bytes.NewBuffer(nil)
if _, err := io.Copy(fileBuffer, downloadStream); err != nil {
log.Fatal(err)
}很旧,但我通过导入goMongo驱动程序获得了另一个解决方案
“go.mongodb.org/mongo-driver/mongo/gridfs”
//下面的代码用于读取文件
fileBuffer := bytes.NewBuffer(nil)
if _, err := io.Copy(fileBuffer, downloadStream); err != nil {
log.Fatal(err)
}为什么会有什么不同?GridFS实现都使输出“看起来像一个文件”。所以这和读取任何文件句柄并返回内容是一样的。为什么会有什么不同呢?GridFS实现都使输出“看起来像一个文件”。因此,这与读取任何文件句柄并返回内容是一样的。我正在考虑这一点,但希望有另一种解决方案,我可以直接为文件提供服务…@WimVanLaer一旦打开
GridFile
,只需一行:http.ServeContent()
。你想要什么?显然,如何打开源是特定于源的。如果需要在多个位置使用,您可以创建一个实用程序函数,只需将w
、r
和name
参数传递到该函数。噢,我忘了GridFile实现了seeker文件,误读了该部分。。。我的巴迪正在考虑这个问题,但我希望有另一个解决方案,我可以直接为文件提供服务…@WimVanLaer一旦你打开GridFile
,它就只有一行:http.ServeContent()
。你想要什么?显然,如何打开源是特定于源的。如果需要在多个位置使用,您可以创建一个实用程序函数,只需将w
、r
和name
参数传递到该函数。噢,我忘了GridFile实现了seeker文件,误读了该部分。。。我的错