处理静态文件

前面的章节我们讲解了 go web server 相关的知识,我们已经可以对路由进行解析,然后匹配对应的句柄处理路由,实现网站页面的输出。在网站开发过程中静态文件处理也是一个必须的功能,您可以使用 http.Handle 或者 http.HandleFunc 通过静态文件或者静态文件夹解析函数来完成这个功能。

实现代码示例

package main

import (
	"log"
	"net/http"
)

func home(w http.ResponseWriter, r *http.Request) {
	html := `<html>
	<body>
		<img src="static/demo.png" />
		<div>hello</div>
	</body>
	<html>`
	w.Write([]byte(html))
}

func staticFunc(w http.ResponseWriter, r *http.Request) {
	http.ServeFile(w, r, "./favicon.ico")
}

func main() {
	// 首页路由
	http.HandleFunc("/", home)

	// 静态文件夹解析
	// StripPrefix将URL中的前缀中的prefix字符串删除,
	// 然后再交给后面的Handler处理,一般是http.FileServer()的返回值。
	// 如果URL不是以prefix开始,或者prefix包含转移字符,最后结果都会返回404,因此要精确匹配URL和prefix
	
	// http.FileServer 函数返回一个Handler,
	// 这个 Handler 向h ttp request 提供文件系统内容,一般使用http.Dir(“yourFilePath”)
	http.Handle(
		"/static/",
		http.StripPrefix("/static/", http.FileServer(http.Dir("./static"))),
	)

	// 单独解析一个静态文件示例
	// favicon.ico 文件
	http.HandleFunc("/favicon.ico", staticFunc)

	err := http.ListenAndServe(":800", nil) //设置监听的端口
	if err != nil {
		log.Fatal("ListenAndServe: ", err)
	}
}