2016-09-11 2 views
1

Я простой папку:Почему мой обработчик 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/ или даже добавить к имени пути файла, его не работает. Я не понимаю, потому что это то же самое, что и ответ, указанный на this subject

Можете ли вы сказать мне, чтобы это не сработало?

ответ

2

Вы должны удалить * и добавить дополнительную вложенную папку 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://localhost:3003/Images/


Или просто использовать:

package main 

import (
    "net/http" 
) 

func main() { 
    fs := http.FileServer(http.Dir("./Images")) 
    http.Handle("/", fs) 
    http.ListenAndServe(":3003", nil) 
} 

с: http://localhost:3003/

0

Точка в ./Images ссылается на текущую рабочую директорию cwd, а не на проект root. Чтобы ваш сервер работал, вы должны запустить его из каталога Test/или адресовать изображения с абсолютным корневым путем.

1

Причина запроса не удалось вернуть то, что вы ожидали, потому что они не соответствуют образцу, определенный в http.Handle(pattern string, handler Handler) вызов. Документация ServeMux содержит описание того, как создавать шаблоны. Любой запрос имеет префикс, сопоставляемый от наиболее специфического к наименее конкретному. Кажется, вы предположили, что шаблон глобуса может быть использован. Ваш обработчик был бы вызван с запросами на /Images/*<file system path>. Вам необходимо определить путь к каталогу, например, Images/.

На стороне примечания, стоит подумать о том, как ваша программа получает путь к каталогу для обслуживания файлов. Жесткое кодирование означает, что ваша программа будет работать только в определенном месте в файловой системе, которая невероятно хрупка. Вы можете использовать аргумент командной строки, чтобы позволить пользователям указывать путь или использовать файл конфигурации, обработанный во время выполнения. Эти соображения упрощают модульность и тестирование вашей программы.

Смежные вопросы