Golang 中 http.FileServer 的几种玩法

自用笔记,仅作参考

最简例子

package main

import (
    "net/http"
)

func main() {
    http.Handle("/", http.FileServer(http.Dir("D:\\Coding\\learnGo\\src\\main\\html\\")))
    http.ListenAndServe(":8080", nil)
}
这样,一个最简易的文件服务器就算搭建好了。
其中http.Handle的第一个参数用于网页地址,第二个相当于对应磁盘上的文件夹,默认会寻找index.html 文件,但并不会执行其中(如果有引用)的 JS 代码。
注意,若使用Handle函数,第一个参数必须与目录下的文件夹名相同。这个问题可以使用HandleFunc解决。

呈现一个 html 文件

package main

import (
    "fmt"
    "html/template"
    "log"
    "net/http"
)

func index(w http.ResponseWriter, r *http.Request) {
    if r.Method == "GET" {
        t, err := template.ParseFiles("D:\\Coding\\learnGo\\src\\main\\html\\index.html")
        if err != nil {
            fmt.Fprintf(w, "parse template error: %s", err.Error())
            return
        }
        t.Execute(w, nil)
    }
}

func main() {
    http.HandleFunc("/", index)
    err := http.ListenAndServe(":8080", nil)
    if err != nil {
        log.Fatal("Listen AndServe: ", err)
    }
}
在这个例子中,可以自定义页面链接和需要的 html 文件。通常 html 书写方法在多页面开发上效率较低,因此需要使用 http/template中支持的模板引擎语法来对 html 文件进行重写。

只允许访问文件

func js(w http.ResponseWriter, r *http.Request) {
    fmt.Printf("禁止访问:%s\n", r.URL.Path)
    old := r.URL.Path
    name := path.Clean("D:\\Coding\\learnGo\\src\\main\\html\\" + strings.Replace(old, "/js", "/", 1))
    info, err := os.Lstat(name)
    if err == nil {
        if !info.IsDir() {
            http.ServeFile(w, r, name)
        } else {
            http.NotFound(w, r)
        }
    } else {
        http.NotFound(w, r)
    }
}

Go 在 Linux 系统中的安装方法

顺手记一下 Go 在 Linux 系统中的配置。
  1. 下载源文件
    $ wget https://dl.google.com/go/go1.11.4.linux-amd64.tar.gz
    
  2. 将下载的二进制包解压至 /usr/local目录
    $ tar -C /usr/local -xzf go1.4.linux-amd64.tar.gz
    
  3. 将 /usr/local/go/bin 目录添加至PATH环境变量,在/etc/profile文件追加
    $ echo "export PATH=$PATH:/usr/local/go/bin" >> /etc/profile
    
  4. 使修改的配置生效
    $ source /etc/profile
    

    参考资料

评论