Статические файлы

Последнее обновление: 04.03.2018

Функция http.FileServer

Содержимое веб-приложения или веб-сайта нередко определяется в виде статических html-страниц. Для них не нужен какой-то дополнительный рендеринг на стороне сервера. Для прямой отправки статических файлов в пакете http определена функция FileServer, которая возващает объект Handler:

 func FileServer(root FileSystem) Handler

В качестве параметра она принимает путь к каталогу со статическими файлами.

Например, определим в каталоге с исходным файлом на Go папку, которую назовем static. Создадим в ней два статических файла: index.html и about.html.

Статические файлы в Go

Определим в файле index.html следующий код:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>Index</title>
    </head>
    <body>
        <h1>Index</h1>
    </body>
</html>

А в файле about.html следующий код:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>About</title>
    </head>
    <body>
        <h1>About</h1>
    </body>
</html>

В главном файле server.go определим следующий код:

package main
import (
	"fmt"
	"net/http"
)
func main() {
	fmt.Println("Server is listening...")
	http.ListenAndServe(":8181", http.FileServer(http.Dir("static")))
}

В функцию http.FileServer() передается путь к файлам, который определяется функцией http.Dir().

Запустим приложение и обратимся по адресу http://localhost:8181

Static files in Go

Путь к корню веб-сайта автоматически сопоставляется с файлом index.html - это все равно, если бы мы обратились по адресу http://localhost:8181/index.html

Также обратимся по адресу http://localhost:8181/about.html. В этом случае мы получим содержимое файла about.html

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

package main
import (
	"fmt"
	"net/http"
)

func main() {
	 
	fs := http.FileServer(http.Dir("static"))
	http.Handle("/", fs)
	
	http.HandleFunc("/about", func(w http.ResponseWriter, r *http.Request){
		fmt.Fprint(w, "About Page")
	})
	http.HandleFunc("/contact", func(w http.ResponseWriter, r *http.Request){
		fmt.Fprint(w, "Contact Page")
	})
	fmt.Println("Server is listening...")
	http.ListenAndServe(":8181", nil)
}

В данном случае с помощью функции http.Handle("/", fs) файловый сервер монтируется к пути "/", то есть к корню сайта. И наряду с этим мы также можем определять обработчики для других маршрутов. Таким образом, будет работать как динамическая генерация контента, так и статические файлы:

Функция http.ServeFile

Также для отправки файлов можно использовать функцию http.ServeFile(). Она отправляет единичный файл по определенному пути. Например, используем ранее определенные файлы index.html и about.html:

package main
import (
    "fmt"
    "net/http"
)
 
func main() {

    http.HandleFunc("/about", func(w http.ResponseWriter, r *http.Request){
        http.ServeFile(w, r, "static/about.html")
    })
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request){
        http.ServeFile(w, r, "static/index.html")
    })
    fmt.Println("Server is listening...")
    http.ListenAndServe(":8181", nil)
}
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850