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

정적 디렉토리에 html 파일을 제공합니다.Goolang에서 특정 html 파일을 제공합니다.

html 파일을 지정할 수있는 이동 방법이 있습니까?

내가 좋아하는 뭔가하고 싶은 Flask

에서 render_template 같은

뭔가 :

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

답변

27

은 아마 custom http.HandlerFunc를 사용하는 것보다 쉽게 ​​:

귀하의 경우를 제외하고, 당신의 FUNC가 http.ServeFile 것을 하나, 하나의 파일 만 제공합니다.

는 "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/ 경로로 시작하는 요청을하는 모든 것이 효과적으로이 기능에 의해 처리됩니다.

r.URL.Path[1:] 

사실, 그렇게하지 않습니다 내가 올바르게 처리 할 수있는 요청을 위해해야 ​​할 일을했을 발견
것은 최고의 '/'를 사용하여 트림이었다.
commit 9b67a5d으로, sztanpetcomments로, 이동 1.6에서 할 수 없습니다 :

제공된 파일이나 디렉토리 이름이 상대 경로 인 경우, 현재 디렉토리에 상대적으로 해석하고 가 상승 할 수있다 부모에게 디렉토리.
제공된 이름이 사용자 입력으로 구성된 경우 ServeFile을 호출하기 전에 위생 처리해야합니다.
예방 조치로 ServeFiler.URL.Path에 ".."경로 요소가 포함 된 요청을 거부합니다.

다음 "URL"에 대하여 보호 할 수

:

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

축하를,이 나쁜 조언이 https://github.com/golang/go/commit/9b67a5de79af56541c48c95c6d7ddc8630e1d0dc – sztanpet

+3

@sztanpet 주셔서 감사합니다 커밋 영감 이 피드백. 그에 따라 대답을 편집했습니다. – VonC

+3

책임을 묻고 개인적으로 저격하지 않는 것에 대해 감사합니다. – sztanpet

1

어쩌면 내가 여기서 뭔가를 놓친하지만 혼란 검색을 많이 후, 나는이 함께 넣어 :

...

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

는 파이어 폭스와 크롬으로 잘 작동합니다. 파일 형식조차 필요하지 않습니다.

+0

StoredAs 매개 변수에 "../../mysecrets?"가 포함 된 경우 어떻게됩니까? –

+0

잘 모르겠지만 어떻게됩니까? – user2099484

+0

디렉터리 트래버스 공격 –

1

당신은이 같이 http.StripPrefix

사용할 수 있습니다

http.Handle("/hello/", http.StripPrefix("/hello/",http.FileServer(http.Dir("static")))) 
관련 문제