http.Handle("/", http.FileServer(http.Dir("static")))
静的ディレクトリのhtml
ファイルを提供します。
Goに、提供するhtml
ファイルを指定する方法はありますか?
何かのようなもの render_template
in Flask
私は次のようなことをしたいです:
http.Handle("/hello", http.FileServer(http.Dir("static/hello.html")))
custom http.HandlerFunc
を使用する方が簡単かもしれません:
あなたの場合を除いて、funcは http.ServeFile
oneになり、1つのファイルのみを提供します。
たとえば、「 Go Web Applications:Serving Static Files 」を参照してください。
ホームハンドラーの下に以下を追加します(下記参照):
http.HandleFunc("/static/", func(w http.ResponseWriter, r *http.Request) {
http.ServeFile(w, r, r.URL.Path[1:])
})
これは、
net/http
パッケージのServeFile関数を使用してコンテンツを提供しています。
実質的に/static/
パスで始まるリクエストを行うものはすべて、この関数によって処理されます。
リクエストを正しく処理するために必要なことの1つは、次を使用して先頭の「/」をトリミングすることでした。
r.URL.Path[1:]
実際には、そうしないでください。
Go 1.6では、 sztanpetcomments で、 commit 9b67a5d のようにできません
指定されたファイルまたはディレクトリ名が相対パスである場合、現在のディレクトリを基準にして解釈され、は親ディレクトリに昇順することがあります。
提供された名前がユーザー入力から作成されている場合、ServeFile
を呼び出す前にサニタイズする必要があります。
予防措置として、ServeFile
は、r.URL.Path
に「..
」パス要素が含まれる要求を拒否します。
これにより、次の「URL」から保護されます。
/../file
/..
/../
/../foo
/..\\foo
/file/a
/file/a..
/file/a/..
/file/a\\..
http.StripPrefix
を使用できます
このような:
http.Handle("/hello/", http.StripPrefix("/hello/",http.FileServer(http.Dir("static"))))
ここで何かを見逃したかもしれませんが、多くの混乱した検索の後、私はこれをまとめました:
...
func downloadHandler(w http.ResponseWriter, r *http.Request) {
r.ParseForm()
StoredAs := r.Form.Get("StoredAs") // file name
data, err := ioutil.ReadFile("files/"+StoredAs)
if err != nil { fmt.Fprint(w, err) }
http.ServeContent(w, r, StoredAs, time.Now(), bytes.NewReader(data))
}
...
DownloadHandlerは、単純なアップロードおよびダウンロードサーバーの一部として呼び出されます。
func main() {
http.HandleFunc("/upload", uploadHandler)
http.HandleFunc("/download", downloadHandler)
http.ListenAndServe(":3001", nil)
}
FirefoxおよびChromeで正常に動作します。ファイルの種類さえ必要ありません。