Почему мой обработчик 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/ или обратиться к изображениям с абсолютным корневым путем.

Другие вопросы по тегам