Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何向golang提供mongodb的文件_Mongodb_Go_Gridfs_Fileserver - Fatal编程技术网

如何向golang提供mongodb的文件

如何向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(后

我正在一个go项目中工作,我需要为存储在mongodb中的文件提供服务。这些文件存储在GridFs中。我使用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文件,误读了该部分。。。我的错