web-dev-qa-db-fra.com

Allez Golang pour servir un fichier html spécifique

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")))
24
user2671513

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'appeler ServeFile.
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\\..
35
VonC

Vous pouvez utiliser http.StripPrefix

Comme ça: 

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

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.

0
user2099484