2014-09-20 8 views
21
http.Handle("/", http.FileServer(http.Dir("static"))) 

Bedient die Datei html im statischen Verzeichnis.Go Golang für eine bestimmte HTML-Datei

Gibt es eine Möglichkeit in Go, dass wir die html Datei angeben zu dienen?

So etwas wie render_template in Flask

Ich möchte wie etwas tun:

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

Antwort

27

Vielleicht ein custom http.HandlerFunc mit einfacher wäre:

Außer in Ihrem Fall Ihre func die http.ServeFile wäre eine, um nur eine Datei zu bedienen.

Siehe zum Beispiel "Go Web Applications: Serving Static Files":

Fügen Sie den folgenden unten zu Hause Handler (siehe unten):

http.HandleFunc("/static/", func(w http.ResponseWriter, r *http.Request) { 
    http.ServeFile(w, r, r.URL.Path[1:]) 
}) 

Dies geschieht mit Hilfe der ServeFile Funktion des net/http Paket um unseren Inhalten zu dienen.
Effektiv alles, was eine Anfrage beginnend mit dem /static/ Pfad macht, wird von dieser Funktion behandelt.
Eine Sache, die ich fand ich für den Antrag, um zu tun hatte, richtig gehandhabt werden sollte, trimmen die führende ‚/‘ mit:

r.URL.Path[1:] 

Eigentlich tun das nicht. Diese
wird nicht möglich sein, in Go 1.6, wie sztanpetcomments, mit commit 9b67a5d:

Wenn die mitgelieferte Datei- oder Verzeichnisnamen ein relativer Pfad ist, ist es relativ zum aktuellen Verzeichnis interpretiert und kann steigen an Eltern Verzeichnisse.
Wenn der angegebene Name aus Benutzereingaben besteht, sollte er vor dem Aufruf von ServeFile bereinigt werden.
Als Vorsichtsmaßnahme wird ServeFile Anfragen ablehnen, wenn r.URL.Path einen „..“ Elementpfad enthält.

, die gegen die folgenden "url" schützen:

/../file 
/.. 
/../ 
/../foo 
/..\\foo 
/file/a 
/file/a.. 
/file/a/.. 
/file/a\\.. 
+4

congrats, diese schlechte Ratschläge inspiriert diese Festschreibung https://github.com/golang/go/commit/9b67a5de79af56541c48c95c6d7ddc8630e1d0dc – sztanpet

+3

@sztanpet Danke für dieses Feedback. Ich habe die Antwort entsprechend bearbeitet. – VonC

+3

Danke, dass Sie verantwortlich sind und meinen Snark nicht persönlich nehmen – sztanpet

1

Vielleicht etwas hier habe ich verpasst, aber nach viel verwirrt suchen, ich habe dies zusammen:

...

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)) 
} 

...

Wo downloadHandler im Rahmen eines einfachen Upload und Download-Server aufgerufen wird:

func main() { 
       http.HandleFunc("/upload", uploadHandler) 
       http.HandleFunc("/download", downloadHandler) 
       http.ListenAndServe(":3001", nil) 
} 

Kompatibel mit Firefox und Chrome in Ordnung. Benötigt nicht einmal einen Dateityp.

+0

Was passiert, wenn der StoredAs-Parameter "../../mysecrets? –

+0

enthält. Ich weiß nicht. Was passiert? – user2099484

+0

Ein Directory-Traversal-Angriff –

1

Sie http.StripPrefix

wie diese verwenden:

http.Handle("/hello/", http.StripPrefix("/hello/",http.FileServer(http.Dir("static")))) 
Verwandte Themen