最新消息:yaf表单扩展中新增加了浮点数、日期和集合的校验。php yaf框架扩展实践三——表单

golang http设置静态目录

Golang 1249浏览 8评论

用golang开发http服务的时候,有时会需要一个静态目录来存放css,js和image图片,并且能通过http访问到。在golang可以用http.FileServer来处理。

http.FileServer原型

func FileServer(root FileSystem) Handler

搭建一个静态文件服务

网站文件目录如下,其中红色框设为相应目录:

文件目录

文件目录

package main

import (
    "log"
    "net/http"
)

func main() {
    h := http.FileServer(http.Dir("/Users/chenjiebin/Sites/goexample/net/http/static"))
    err := http.ListenAndServe(":9090", h)
    if err != nil {
        log.Fatal("ListenAndServe: ", err)
    }
}

运行该项目,在浏览器里访问:

golang文件服务器

golang文件服务器

这个示例把整个http服务作为了文件服务器,在实际中一般会需要结合其它路由使用,这种情况下可以用http.StripPrefix函数来实现。

网站中设置静态目录

package main

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

func index(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hello golang http!")
}

func main() {
    http.HandleFunc("/", index)

    // 设置静态目录
    fsh := http.FileServer(http.Dir("/Users/chenjiebin/Sites/goexample/net/http/static"))
    http.Handle("/static/", http.StripPrefix("/static/", fsh))

    err := http.ListenAndServe(":9090", nil)
    if err != nil {
        log.Fatal("ListenAndServe: ", err)
    }
}

运行浏览器里访问,就可以通过/static/路径访问到相关的静态文件了。

http.StripPrefix设置访问路径

http.StripPrefix设置访问路径

转载请注明:快乐编程 » golang http设置静态目录

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

网友最新评论 (8)

  1. 如果是模板文件,也要这么干吗?
    ```
    os.Getwd()
    ```
    显示当前目录是用户目录~即:/Users/username
    April1年前 (2016-07-16)回复
    • 陈杰斌
      模板文件不用哟,模板文件是程序里直接读取的,不需要通过url能访问到。
      陈杰斌1年前 (2016-07-16)回复
      • 读取的时候也是有路径的,请问这个路径是怎么设置的?
        我在代码中,直接使用相对路径,一直报错,后来查了以后才知道,代码读的路径是/Users/username 就是用户的目录,而不是编译后可执行文件所在的目录
        谢谢回复!
        April1年前 (2016-07-18)回复
        • 陈杰斌
          我大概明白你的意思了。
          关键点应该是在Getwd()函数,Getwd是获取当前的工作目录,如果不设置,是从bash带入进去的。
          比如在terminal的 /Users/username/abc 目录下执行,Getwd()获取到的就是 /Users/username/abc
          可以通过 os.Chdir 修改工作目录。
          陈杰斌1年前 (2016-07-18)回复
        • 陈杰斌
          另外就是golang中用相对路径的话,实际上最终的路径是 Getwd() + 相对路径
          陈杰斌1年前 (2016-07-18)回复
          • 嗯,也就是说,Getwd() + 相对路径 是一种方法

            不过,我记得在搭建 golang 开发环境的时候,是有设置工作目录的。go env 显示:
            ```
            GOARCH="amd64"
            GOBIN="/usr/local/go/bin"
            GOEXE=""
            GOHOSTARCH="amd64"
            GOHOSTOS="darwin"
            GOOS="darwin"
            GOPATH="/Users/KJRS/gowork"
            GORACE=""
            GOROOT="/usr/local/go"
            GOTOOLDIR="/usr/local/go/pkg/tool/darwin_amd64"
            GO15VENDOREXPERIMENT="1"
            CC="clang"
            GOGCCFLAGS="-fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fno-common"
            CXX="clang++"
            CGO_ENABLED="1"
            ```
            难道是因为GOEXT="",所以就成了您说的,是从 bash 带入进去的?
            April1年前 (2016-07-18)
          • 陈杰斌
            可以查下 os.Environ() 中的 PWD
            陈杰斌1年前 (2016-07-18)
          • PWD=/Users/KJRS/gowork/src/learn
            是这样的,然后把代码改回https://astaxie.gitbooks.io/build-web-application-with-golang/content/zh/04.1.html中的代码,结果还是报错,不行!
            使用 os.Getwd() 就可以
            April1年前 (2016-07-19)