golang 资源解释为样式表但以 MIME 类型传输 text/plain
golang Resource interpreted as Stylesheet but transferred with MIME type text/plain
我在使用 golang 开发网页时遇到问题。
服务器文件(main.go):
package main
import (
"net/http"
"io/ioutil"
"strings"
"log"
)
type MyHandler struct {
}
func (this *MyHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
path := r.URL.Path[1:]
log.Println(path)
data, err := ioutil.ReadFile(string(path))
if err == nil {
var contentType string
if strings.HasSuffix(path, ".css") {
contentType = "text/css"
} else if strings.HasSuffix(path, ".html") {
contentType = "text/html"
} else if strings.HasSuffix(path, ".js") {
contentType = "application/javascript"
} else if strings.HasSuffix(path, ".png") {
contentType = "image/png"
} else if strings.HasSuffix(path, ".svg") {
contentType = "image/svg+xml"
} else {
contentType = "text/plain"
}
w.Header().Add("Content Type", contentType)
w.Write(data)
} else {
w.WriteHeader(404)
w.Write([]byte("404 Mi amigo - " + http.StatusText(404)))
}
}
func main() {
http.Handle("/", new(MyHandler))
http.ListenAndServe(":8080", nil)
}
但是当我输入 http://localhost:8080/templates/home.html
这是我看到的 see screenshot
为什么我的页面加载不正确??我的 css 在哪里??为什么在我处理 main.go 中的内容类型时出现错误 "Resource interpreted as Stylesheet but transferred with MIME type text/plain:"??
你的基本问题很简单:你需要 Content-Type
而不是 Content Type
。
但是,有一种更好的方法可以将 MIME 类型与 Go 中的文件扩展名相匹配,特别是 mime
标准库包。我强烈建议您使用它。
如“Milo Christiansen”所述,哑剧在这种情况下会有所帮助。
我还想指出,使用 io.Copy 而不是 ioutil.ReadFile 会更有效(如果流复制可以发生在内核级别,它就可以)
package main
import (
"io"
"log"
"mime"
"net/http"
"os"
"path/filepath"
)
func main() {
http.HandleFunc("/", ServeFile)
log.Fatal(http.ListenAndServe(":8400", nil))
}
func ServeFile(resp http.ResponseWriter, req *http.Request) {
path := filepath.Join("./resource/", req.URL.Path)
file, err := os.Open(path)
if err != nil {
http.Error(resp, err.Error(), http.StatusNotFound)
return
}
if contentType := mime.TypeByExtension(filepath.Ext(path)); len(contentType) > 0 {
resp.Header().Add("Content-Type", contentType)
}
io.Copy(resp, file)
}
我在使用 golang 开发网页时遇到问题。 服务器文件(main.go):
package main
import (
"net/http"
"io/ioutil"
"strings"
"log"
)
type MyHandler struct {
}
func (this *MyHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
path := r.URL.Path[1:]
log.Println(path)
data, err := ioutil.ReadFile(string(path))
if err == nil {
var contentType string
if strings.HasSuffix(path, ".css") {
contentType = "text/css"
} else if strings.HasSuffix(path, ".html") {
contentType = "text/html"
} else if strings.HasSuffix(path, ".js") {
contentType = "application/javascript"
} else if strings.HasSuffix(path, ".png") {
contentType = "image/png"
} else if strings.HasSuffix(path, ".svg") {
contentType = "image/svg+xml"
} else {
contentType = "text/plain"
}
w.Header().Add("Content Type", contentType)
w.Write(data)
} else {
w.WriteHeader(404)
w.Write([]byte("404 Mi amigo - " + http.StatusText(404)))
}
}
func main() {
http.Handle("/", new(MyHandler))
http.ListenAndServe(":8080", nil)
}
但是当我输入 http://localhost:8080/templates/home.html 这是我看到的 see screenshot 为什么我的页面加载不正确??我的 css 在哪里??为什么在我处理 main.go 中的内容类型时出现错误 "Resource interpreted as Stylesheet but transferred with MIME type text/plain:"??
你的基本问题很简单:你需要 Content-Type
而不是 Content Type
。
但是,有一种更好的方法可以将 MIME 类型与 Go 中的文件扩展名相匹配,特别是 mime
标准库包。我强烈建议您使用它。
如“Milo Christiansen”所述,哑剧在这种情况下会有所帮助。 我还想指出,使用 io.Copy 而不是 ioutil.ReadFile 会更有效(如果流复制可以发生在内核级别,它就可以)
package main
import (
"io"
"log"
"mime"
"net/http"
"os"
"path/filepath"
)
func main() {
http.HandleFunc("/", ServeFile)
log.Fatal(http.ListenAndServe(":8400", nil))
}
func ServeFile(resp http.ResponseWriter, req *http.Request) {
path := filepath.Join("./resource/", req.URL.Path)
file, err := os.Open(path)
if err != nil {
http.Error(resp, err.Error(), http.StatusNotFound)
return
}
if contentType := mime.TypeByExtension(filepath.Ext(path)); len(contentType) > 0 {
resp.Header().Add("Content-Type", contentType)
}
io.Copy(resp, file)
}