随学随记,留备查
1、核心是需要获取文件的绝对路径,os.Open()需要;
2、windows使用“\”表示路径,而go需要“/”表示路径,所以需要将“\”替换为“/”;
3、使用内置的http.ServerFile()函数提供后续的文件传输服务;
package main import ( "fmt" "log" "net/http" "os" "path/filepath" "strings" ) var StaticDir = "/static" func getCurDir() string { dir, err := filepath.Abs(filepath.Dir(os.Args[0])) if err != nil { log.Fatal(err) } return strings.Replace(dir, "\\", "/", -1) } func dealStaticFiles(w http.ResponseWriter, r *http.Request) { stDir := getCurDir() if strings.HasPrefix(r.URL.Path, StaticDir) { file := stDir + r.URL.Path fmt.Println(file) f, err := os.Open(file) defer f.Close() if err != nil && os.IsNotExist(err) { fmt.Fprintln(w, "File not exist") return } http.ServeFile(w, r, file) return } else { fmt.Fprintln(w, "Hello world") } } func main() { http.HandleFunc("/", dealStaticFiles) //设置访问的路由 err := http.ListenAndServe(":8080", nil) //设置监听的端口 if err != nil { log.Fatal("ListenAndServe: ", err) } }
有疑问加站长微信联系(非本文作者)