Как подать файл из mongodb с голангом - PullRequest
0 голосов
/ 05 июня 2018

Я работаю над проектом go, где мне нужно обслуживать файлы, хранящиеся в mongodb.Файлы хранятся в GridFs.Я использую gopkg.in/mgo.v2 в качестве пакета для подключения и запроса базы данных.

Я могу получить файл из базы данных, это не сложно.

f, err := s.files.OpenId(id)

Но как можноЯ подаю этот файл с http?Я работаю с роутером JulienSchmidt для обработки всех остальных повторных запросов.Решения, которые я нахожу, всегда используют статические файлы, а не файлы из базы данных.

Заранее спасибо

1 Ответ

0 голосов
/ 05 июня 2018

Совет: рекомендуется использовать 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
}
...