Я немного смущен. Многие примеры показывают использование обоих: http.ServeFile(..)
и http.FileServer(..)
, но, похоже, они имеют очень тесную функциональность. Также я не нашел информации о том, как установить пользовательский обработчик NotFound.
// This works and strip "/static/" fragment from path
fs := http.FileServer(http.Dir("static"))
http.Handle("/static/", http.StripPrefix("/static/", fs))
// This works too, but "/static2/" fragment remains and need to be striped manually
http.HandleFunc("/static2/", func(w http.ResponseWriter, r *http.Request) {
http.ServeFile(w, r, r.URL.Path[1:])
})
http.ListenAndServe(":8080", nil)
Я попытался прочитать исходный код, и оба из них используют serveFile(ResponseWriter, *Request, FileSystem, string, bool)
базовую функцию. Однако http.FileServer
верните fileHandler
со своим собственным методом ServeHTTP()
и выполните некоторую подготовительную работу перед подачей файла (например, path.Clean()).
Так зачем же это разделение? Какой метод лучше использовать? И как я могу настроить пользовательский обработчик NotFound, например, если запрошенный файл не найден?