我有一个关于在Go中提供文件的快速问题。有很好的节省时间的FileServer处理程序,但对于我的用例,我只有2到3个文件(js和css)与我的应用程序一起使用,我不想让部署变得复杂而不得不考虑这些。
你认为有没有一种简单的方法可以将这两个文件构建到二进制文件中并从那里提供服务。例如,base64将文件的数据编码为常量,并从常量中服务器文件。这将以其最简单的形式工作,但我不想独自经历文件服务器所做的所有事情(头、过期、mime类型等)的痛苦。那么,有没有一种简单的方法可以将这些静态文件以某种形式烘焙到二进制文件中,并以这种方式提供服务?
发布于 2014-02-09 03:16:21
"go.rice“包会为您解决这个问题--在二进制文件中嵌入资源,并提供一个http.FileSystem实现。
发布于 2014-02-06 15:34:36
按你的要求去做并不是很难。您不必对其进行base64编码或任何其他操作(这只会使您更难编辑它。)
以下是如何输出具有正确mime类型的javascript文件的示例:
package main
import (
"fmt"
"log"
"net/http"
)
const jsFile = `alert('Hello World!');`
func main() {
http.HandleFunc("/file.js", JsHandler)
log.Fatal(http.ListenAndServe(":8080", nil))
}
func JsHandler(w http.ResponseWriter, r *http.Request) {
// Getting the headers so we can set the correct mime type
headers := w.Header()
headers["Content-Type"] = []string{"application/javascript"}
fmt.Fprint(w, jsFile)
}发布于 2014-02-06 15:26:42
我会将文件以纯文本的形式存储在变量中。如下所示:
package main
import (
"fmt"
"log"
"net/http"
)
var files = map[string]string{}
func init() {
files["style.css"] = `
/* css file content */
body { background-color: pink; }
`
}
func init() {
files["index.html"] = `
<!-- Html content -->
<html><head>
<link rel="stylesheet" type="text/css" href="style.css">
</head><body>Hello world!</body></html>
`
}
func main() {
for fileName, content := range files {
contentCpy := content
http.HandleFunc("/"+fileName, func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "%s\n", contentCpy)
})
}
log.Fatal(http.ListenAndServe(":8080", nil))
}这样,就很容易拥有makefile或构建脚本,如下所示:
for file in index.html style.css; do echo "package main\nfunc init() { files[\"$file\"] = \`$(cat $file)\` }" | gofmt -s > $file.go; done; go build && ./httptest
https://stackoverflow.com/questions/21595295
复制相似问题