web-dev-qa-db-ja.com

Golangに移動して特定のhtmlファイルを提供します

http.Handle("/", http.FileServer(http.Dir("static")))

静的ディレクトリのhtmlファイルを提供します。

Goに、提供するhtmlファイルを指定する方法はありますか?

何かのようなもの render_template in Flask

私は次のようなことをしたいです:

http.Handle("/hello", http.FileServer(http.Dir("static/hello.html")))
27
user2671513

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\\..
38
VonC

http.StripPrefixを使用できます

このような:

http.Handle("/hello/", http.StripPrefix("/hello/",http.FileServer(http.Dir("static"))))
3
Mohanson

ここで何かを見逃したかもしれませんが、多くの混乱した検索の後、私はこれをまとめました:

...

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で正常に動作します。ファイルの種類さえ必要ありません。

1
user2099484