> по факту, это одна и та же функция, просто в разных обёртках.
Как бы то ни было, "заточка" у этих функций разная.
http.ServeFile() не отдаст нормально HTML-статику. Я долго пытался. :(( Тупо потерял время.
Если вы говорите про отдать функцией http.ServeFile() - то не выйдет. (Было обсуждение про это.)
Подменять для http.FileServer() - потому что только она корректно отдаёт HTML-подобную статику (насколько могу судить - именно для этого предназначена).
> это не сложно, подмените URL в r.URL.Path
Можете написать пример? Достаточно одной строки - типа _что-то_тут_.http.FileServer(http.Dir(varDir)) , дальше разберусь.
> http.Dir(".") означает "текущая директория", то есть та, откуда запущенно приложение.
Директория расположения приложения (типа Go-сервера, если приложение - сервер), или директория сайта (public_html)?
Я вообще-то роутинг делаю. Поэтому и копался в http.FileServer().
Может быть надоумите как такой алгоритм сделать (здесь конструкция по аналогии с тем примером из FileServer() пример DotFileHiding)?:
// Имеем html_public: http.Dir("site.com").
// Имеем входящий URL: site.com/blog/p555 (окончание - это изменяемый идентификатор, здесь значение для примера).
func editURL() {
Проверяем окончание_URL.
Если там код_p555, то приводим URL к виду: site.com/page555.html; и как-то передаём его в хэндлер в функцию http.FileServer(Dir("site.com")).
Если там некорректный код, то обрабатываем ошибку.
}
func main() {
Handle("/blog/", http.FileServer(editURL()))
http.ListenAndServe(":200", nil)
}
http.FileServer() отдаёт файлы из указанной директории, так?
Как он отдаст мои (подключенные) CSS / JS? По указанному в HTML'е (т. е. в URL'е) пути? Т. е. вот так: URL = site.com/css/my.css - вернёт с сервера файл $/css/my.css. Верно?
Это всё ясно. Никакой свой метод я не придумываю.
Сунулся к http.FileServer() - не смог с ним разобраться. (( Стал юзать http.ServeFile().
Что неправильно в моём коде (который привёл выше), отдающем файлы и пишущем тип_контента в HTTP-заголовок?
> Я как понял, вы отправляете в одном подключении несколько файлов, так нельзя,
Не. Мой сервер разбирается с каждым запросом. Вот код (фрагмент для отправки CSS и JS):
if elemEndTwoPath == "css" {
var contType = "text/css; charset=UTF-8"
w.Header().Add("Content-Type", contType)
http.ServeFile(w, r, FileName_CSS) // Отдаём файл.
return
}
if elemEndTwoPath == "js" {
var contType = "text/javascript; charset=UTF-8"
w.Header().Add("Content-Type", contType)
http.ServeFile(w, r, FileName_JS) // Отдаём файл.
return
}
> он сделает много работы при отдаче файлов, не понимаю, почему он вам не подходит.
Это отдельная тема. Может быть потому, что я не умею с ним работать; может быть потому, что у меня сложный маршрутизатор (делая который мне проще оказалось использовать http.ServeFile)...
Сейчас решаю проблему с распознаванием браузерами моих файлов.
Запись в заголовок типа_контента ПЕРЕД отправкой файла - не помогла. (
Не могу нагуглить про функцию WriteHeader()... Можете пояснить смысл записи статуса? (Например, статус "200" у меня сервер отправляет автоматом; разве другие статусы он также не отправит?) И необходима ли она для записи в заголовок типа_контента (т. е. решит ли её добавление в код мою проблему)?
Я не раздаю файлы. Всего лишь отправляю сопровождающие_файлы вслед за HTML-страницей (которые в ней подключены и запрашиваются браузером).
> до того, как вызовите функцию w.WriteHeader(status)
Упс.... Это я упустил. Я просто сразу вслед за отправкой файла пишу (или думаю, что пишу) в HTTP-заголовок его тип_контента.
Я говорю о том, что считается (как и в Документации сказано) "файл есть" - это там где false у функции os.IsNotExist(). В этом суть моей поправки.
Все остальное тоже верно.
Это понятно - что нюансы есть.
Но вот конкретно ваш первоначальный код для конкретно моей задачи проверки наличия файла для его отдачи в ответ на URL-запрос - не подходит, ибо там внешний-первый if мешается. А "общий" код из Документации - самое то.
> там может быть что угодно, открытие файла и чтение данных, удаление файла, ...
Это всё у функции os.Stat()? (Речь же про неё.)
> не факт, что когда другая ошибка, файл существует.
> Например, у вас вышел из строя ссд, ...
Может и не факт. Но другого инструмента у нас нет. Сказано в Документации (и общей практикой): вот эту "другую ошибку" считать за наличие файла - значит так и считаем.
Как бы то ни было, "заточка" у этих функций разная.
http.ServeFile() не отдаст нормально HTML-статику. Я долго пытался. :(( Тупо потерял время.