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