如何使用 golang 从 mongodb 提供文件

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 路由器来处理所有其他剩余请求。我找到的解决方案始终使用静态文件,而不是数据库中的文件。

提前致谢

icz*_*cza 5

提示:建议使用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)