在http .mp4文件中输出,从数据库拉到浏览器

时间:2017-12-26 07:41:59

标签: mongodb http go mux

回答

我在使用Go的http包时使用Mongodb和Gridfs很难。我试图将.mp4文件存储到Gridfs中,然后将其拉出到浏览器中进行播放。

  

这是我现在正在做的事情。它成功地从中提取文件   数据库,我甚至可以将它正确写入下载位置。

// Connect to database
// Session to database

func movie(w http.ResponseWriter r *http.Request) {
    file, err := db.GridFS("fs").Open("movie.mp4")
    if err != nil {
        log.Println(err)
    }
    defer file.Close()

    w.Header.Set("Content-type", "video/mp4")
    if _, err := io.Copy(w, file); err != nil {
    log.Println(err)
    } 
    // I am trying to send it to the browser.
    // I want to achieve same thing as, http://localhost/view/movie.mp4, 
    as if you did that.
}

如果文件在服务器上,我会做这样的事情。但我试图将它存储在Mongodb中,以便更容易地使用涉及元数据。

func movie(w http.ResponseWriter r *http.Request) {
    http.ServeFile("./uploads/movie.mp4") // Easy
}

浏览器正在接收某些内容,但它只是格式错误或已损坏。只是向视频播放器显示错误消息。任何帮助将不胜感激,我只编程一周。

这是错误的图片,没有控制台错误消息。

enter image description here

  

除非有人可以替代存储视频文件进行播放   在MongoDB或Amazon S3以外的浏览器中。请告诉我,   感谢。

1 个答案:

答案 0 :(得分:1)

您可能需要查看http.ServeContent。它将自动处理所有混乱(内容类型,内容长度,部分数据,缓存)并为您节省大量时间。它需要一个ReadSeeker来服务,GridFile已经实现了它。因此,您的代码可能只是更改为以下内容。

func movie(w http.ResponseWriter r *http.Request) {
    file, err := db.GridFS("fs").Open("movie.mp4")
    if err != nil {
        log.Println(err)
    }
    defer file.Close()

    http.ServeContent(w,r,"movie.mp4",file.UploadDate(),file)

}

如果这不起作用,请使用curl或wget等工具下载所提供的内容,并将其与原始内容进行比较(在db中)。