http.Handle("/", http.FileServer(http.Dir("static")))
Sert le fichier html
dans un répertoire statique.
Existe-t-il un moyen dans Go de spécifier le fichier html
à servir?
Quelque chose comme render_template
dans Flask
Je veux faire quelque chose comme:
http.Handle("/hello", http.FileServer(http.Dir("static/hello.html")))
Peut-être qu’utiliser un custom http.HandlerFunc
serait plus simple:
Sauf dans votre cas, votre fonction serait le http.ServeFile
one, pour servir un seul fichier.
Voir par exemple " Aller Applications Web: Servir des fichiers statiques ":
Ajoutez ce qui suit sous votre home handler(voir ci-dessous):
http.HandleFunc("/static/", func(w http.ResponseWriter, r *http.Request) {
http.ServeFile(w, r, r.URL.Path[1:])
})
Ceci utilise la fonction ServeFile du paquetage
net/http
pour servir notre contenu.
Effectivement, tout ce qui fait une demande commençant par le chemin/static/
sera traité par cette fonction.
Une chose que j’ai trouvée à faire pour que la demande soit traitée correctement a été de couper les ‘/’ d’avant en utilisant:
r.URL.Path[1:]
En fait, ne fais pas ça.
Cela ne sera pas possible dans Go 1.6, car sztanpetcommentaires , avec commit 9b67a5d :
Si le nom de fichier ou de répertoire fourni est un chemin relatif, il s'agit de interprété par rapport au répertoire en cours et peut remonter au parent répertoires.
Si le nom fourni est construit à partir d'une entrée utilisateur, il doit être nettoyé avant d'appelerServeFile
.
Par précaution,ServeFile
rejettera les demandes oùr.URL.Path
contient un élément de chemin "..
".
Cela protégera contre les "url" suivants:
/../file
/..
/../
/../foo
/..\\foo
/file/a
/file/a..
/file/a/..
/file/a\\..
Vous pouvez utiliser http.StripPrefix
Comme ça:
http.Handle("/hello/", http.StripPrefix("/hello/",http.FileServer(http.Dir("static"))))
J'ai peut-être manqué quelque chose ici, mais après beaucoup de recherches confuses, j'ai rassemblé ceci:
...
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))
}
...
Où downloadHandler est appelé dans le cadre d'un simple serveur de téléchargement et de téléchargement:
func main() {
http.HandleFunc("/upload", uploadHandler)
http.HandleFunc("/download", downloadHandler)
http.ListenAndServe(":3001", nil)
}
Fonctionne bien avec Firefox et Chrome. N'a même pas besoin d'un type de fichier.