在 http 中输出一个 .mp4 文件,从数据库中提取到浏览器

Output in http a .mp4 file, issue pulling from database to browser

已回答

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

Heres what I am doing now. It successfully pulls the file from database, I could even write it correctly to a download location.

// 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
}

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

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

Unless someone has an alternative to storing video files for playback in browser somewhere other than MongoDB or Amazon S3. Please let me know, thanks.

您可能需要查看 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 为单位)进行比较。