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

html dosyasını statik dizine kaydeder.Belirli bir html dosyasını sunmak için Golang'a gidin.

Gitme işleminde html dosyasını belirtmek için herhangi bir yol var mı?

ben böyle bir şey yapmak istiyorum Flask

yılında render_template gibi

şey:

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

cevap

27

Belki custom http.HandlerFunc kullanarak olacaktır kolay:

senin durum dışında, senin fonk http.ServeFile olurdu Bir, sadece bir dosyaya hizmet için.

"Go Web Applications: Serving Static Files" Örneğin bakınız:

ev işleyicisi aşağıdakileri ekleyin (aşağıya bakınız):

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

Bu net/http paketin ServeFile fonksiyonunu kullanıyor İçeriğimize hizmet etmek.
/static/ yolundan başlayarak bir istek yapan etkili bir işlev bu işlev tarafından ele alınacaktır.

r.URL.Path[1:] 

Aslında bunu yapma: Ben doğru ele alınması isteği için sırayla yapmak zorunda bulundu
Bir şey lider ‘/’ kullanarak Döşeme oldu.
Bu commit 9b67a5d ile sztanpetcomments olarak, Go 1.6 mümkün olmayacaktır:

sağlanan dosya veya dizin adı göreli bir yol ise, geçerli dizine göre yorumlanacaktır ve yükselebilir olduğunu ana dizinleri için.
Sağlanan ad kullanıcı girdisinden oluşturulmuşsa, ServeFile numaralı telefonu aramadan önce dezenfekte edilmelidir.
Bir önlem olarak, ServeFile, r.URL.Path'un bir ".." yol öğesi içerdiği istekleri reddeder.

aşağıdaki "url" karşı koruyacak

:

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

Tebrikler, bu kötü bir tavsiye bu https://github.com/golang/go/commit/9b67a5de79af56541c48c95c6d7ddc8630e1d0dc – sztanpet

+3

@sztanpet için teşekkür ederiz tamamlama ilham bu geri bildirim. Cevabını buna göre düzenledim. – VonC

+3

Sorumlu olduğum için teşekkür ederim ve benim şahsımdan şahsen almadığım için – sztanpet

1

Belki burada bir şey kaçırdım ama karışık arama bir sürü sonra, bu araya:

...

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 basit yükleme ve indirme sunucusunun parçası olarak çağrılır

:

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

Firefox ve Chrome ile ince çalışır. Dosya türüne bile gerek yoktur.

+0

StoredAs parametresi "../../mysecrets? –

+0

içeriyorsa ne olur? Bilmiyorum. Ne olur? – user2099484

+0

Bir dizin çapraz geçiş –

1

Bu gibi mi http.StripPrefix

kullanabilirsiniz:

http.Handle("/hello/", http.StripPrefix("/hello/",http.FileServer(http.Dir("static")))) 
İlgili konular