Почему мой обработчик fileServer не работает?
У меня есть простая папка:
Test/
main.go
Images/
image1.png
image2.png
index.html
В основной main.go я просто положил:
package main
import (
"net/http"
)
func main(){
fs := http.FileServer(http.Dir("./Images"))
http.Handle("/Images/*", fs)
http.ListenAndServe(":3003", nil)
}
Но когда я свернулся на http://localhost:3003/Images/ или даже добавил к имени файла пути, это не сработало. Я не понимаю, потому что это так же, как ответ на эту тему
Можете ли вы сказать мне, что это не работает?
3 ответа
Вы должны удалить *
и добавьте дополнительную подпапку Images
:
Это отлично работает:
Test/
main.go
Images/
Images/
image1.png
image2.png
index.html
Код:
package main
import (
"net/http"
)
func main() {
fs := http.FileServer(http.Dir("./Images"))
http.Handle("/Images/", fs)
http.ListenAndServe(":3003", nil)
}
затем go run main.go
А также:
HTTP: // локальный: 3003 / Изображения /
Или просто используйте:
package main
import (
"net/http"
)
func main() {
fs := http.FileServer(http.Dir("./Images"))
http.Handle("/", fs)
http.ListenAndServe(":3003", nil)
}
с помощью: http://localhost:3003/
Причина, по которой запрос не смог вернуть ожидаемый результат, заключается в том, что они не соответствуют шаблону, определенному в http.Handle(pattern string, handler Handler)
вызов. Документация ServeMux предоставляет описание того, как составлять шаблоны. Любой запрос с префиксом сопоставляется от наиболее конкретного к наименее конкретному. Похоже, вы предположили, что можно использовать шаблон глобуса. Ваш обработчик был бы вызван с запросами к /Images/*<file system path>
, Вам нужно определить путь к каталогу, например, Images/
,
Кстати, стоит подумать, как ваша программа получает путь к каталогу для обслуживания файлов. Жесткое кодирование родственника означает, что ваша программа будет работать только в определенном месте в файловой системе, которая невероятно хрупкая. Вы можете использовать аргумент командной строки, чтобы пользователи могли указать путь, или использовать файл конфигурации, проанализированный во время выполнения. Эти соображения облегчают модульность и тестирование вашей программы.
Точка в./Images ссылается на текущий рабочий каталог cwd, а не на проект root. Чтобы ваш сервер работал, вы должны запустить его из каталога Test/ или обратиться к изображениям с абсолютным корневым путем.