Wim*_*aer 1 fileserver go mongodb gridfs
我正在开发一个 go 项目,我需要提供存储在 mongodb 中的文件。这些文件存储在 GridF 中。我使用 gopkg.in/mgo.v2 作为包来连接和查询数据库。
我可以从数据库检索文件,这并不难。
f, err := s.files.OpenId(id)
Run Code Online (Sandbox Code Playgroud)
但是我怎样才能通过 http 来提供该文件呢?我使用 JulienSchmidt 路由器来处理所有其他剩余请求。我找到的解决方案始终使用静态文件,而不是数据库中的文件。
提前致谢
提示:建议使用github.com/globalsign/mgo代替gopkg.in/mgo.v2(后者不再维护)。
该mgo.GridFile类型实现了io.Reader,因此您可以使用io.Copy()将其内容复制到http.ResponseWriter.
但既然mgo.GridFile也实现了io.Seeker,你就可以利用了http.ServeContent()。引用它的文档:
ServeContent 相对于 io.Copy 的主要优点是它可以正确处理 Range 请求、设置 MIME 类型并处理 If-Match、If-Unmodified-Since、If-None-Match、If-Modified-Since 和 If-Range要求。
提供文件服务的处理程序示例:
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
}
Run Code Online (Sandbox Code Playgroud)