Подтвердить что ты не робот

Go Golang для работы с определенным html файлом

http.Handle("/", http.FileServer(http.Dir("static")))

Служит html файлу в статическом каталоге.

Есть ли способ в Go, чтобы мы могли указать файл html для обслуживания?

Что-то вроде render_template in Flask

Я хочу сделать что-то вроде:

http.Handle("/hello", http.FileServer(http.Dir("static/hello.html")))
4b9b3361

Ответ 1

Возможно, использование custom http.HandlerFunc будет проще:

За исключением вашего случая, ваша функция будет http.ServeFile one, для обслуживания всего одного файла.

См. например: Перейти к веб-приложениям: обслуживание статических файлов":

Добавьте ниже приведенный ниже ваш домашний обработчик (см. ниже):

http.HandleFunc("/static/", func(w http.ResponseWriter, r *http.Request) {
    http.ServeFile(w, r, r.URL.Path[1:])
})

Это использует функцию net/http ServeFile для обслуживания нашего контента.
Эффективно все, что делает запрос, начинающийся с пути /static/, будет обрабатываться этой функцией.
Одна вещь, которую я обнаружил, что я должен был сделать, чтобы запрос обрабатывался правильно, обрезал ведущий '/using:

r.URL.Path[1:]

Собственно, не делай этого. Это невозможно в Go 1.6, поскольку sztanpet комментарии, с commit 9b67a5d:

Если предоставленное имя файла или каталога является относительным путем, это интерпретируется относительно текущего каталога и может восходить к родительскому каталоги.
Если предоставленное имя создано из пользовательского ввода, его следует очистить до вызова ServeFile.
В качестве меры предосторожности ServeFile отклонит запросы, в которых r.URL.Path содержит элемент пути "..".

Это защитит от следующего "url":

/../file
/..
/../
/../foo
/..\\foo
/file/a
/file/a..
/file/a/..
/file/a\\..

Ответ 2

Возможно, я что-то пропустил, но после много путаных поисков я поставил это вместе:

...

func downloadHandler(w http.ResponseWriter, r *http.Request) {
        r.ParseForm()
        StoredAs := r.Form.Get("StoredAs") // file name
        data, err := ioutil.ReadFile("files/"+StoredAs)
        if err != nil { fmt.Fprint(w, err) }
        http.ServeContent(w, r, StoredAs, time.Now(),   bytes.NewReader(data))
}

...

Где downloadHandler вызывается как часть простого сервера загрузки и загрузки:

func main() {
              http.HandleFunc("/upload", uploadHandler)
              http.HandleFunc("/download", downloadHandler)
              http.ListenAndServe(":3001", nil)
}   

Прекрасно работает с Firefox и Chrome. Даже не нужен тип файла.

Ответ 3

Вы можете использовать http.StripPrefix

Вот так:

http.Handle("/hello/", http.StripPrefix("/hello/",http.FileServer(http.Dir("static"))))