Golang:io.Copy(httpReponseWriter,os.File)与http.ServeFile()

Dan*_*son 3 css http go

在认识到http包有内置的ServeFile方法之前,我实现了一个或多或少的静态处理程序:

func StaticHandler(w http.ResponseWriter, r *http.Request) {
    filename := mux.Vars(r)["static"] // using gorilla/mux
    f, err := os.Open(fmt.Sprintf("%v/static/%v", webroot, filename))

    if err != nil {
        http.NotFound(w, r)
        return
    }

    defer f.Close()

    io.Copy(w, f)
}
Run Code Online (Sandbox Code Playgroud)

例如,通过这种方式链接我的样式表和图像:

<img href="/image.jpg" />
<link rel="stylesheet" type="text/css" href="/stylesheet.css">
Run Code Online (Sandbox Code Playgroud)

这样做很好,除了一件事:我的链接样式表没有被浏览器应用(在Chrome,Firefox,Midori中测试过).可以提供样式表(访问MYSITE/stylesheet.css显示css纯文本),图像将在页面中正常加载,但我的页面都没有任何样式.

任何想法为什么?

Dan*_*son 5

简单回答:标题错了.

Go将为html,jpgs和pngs提供正确的标题,但css(和js)文件保留为"text/plain"而不是"text/css"和"text/javascript".

Go source显示了被调用的处理,我相信.

无论如何,通过以下方式设置内容类型:

w.Header().Set("Content-Type", "text/css; charset=utf-8")
Run Code Online (Sandbox Code Playgroud)

诀窍.