рдЬрдм рдореИрдВрдиреЗ рдЧреЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрд╛, рддреЛ рдореИрдВрдиреЗ рдХреЗрд╡рд▓ рдЕрдкрдиреЗ рд▓рд┐рдП рдХреБрдЫ рдирдпрд╛ рдХрд░рдиреЗ рдХреА рдЗрдЪреНрдЫрд╛ рдХрд╛ рдкреАрдЫрд╛ рдХрд┐рдпрд╛ред рдмрд╛рдж рдореЗрдВ рдореБрдЭреЗ рдорд╣рд╕реВрд╕ рд╣реБрдЖ рдХрд┐ рд╡реЗрдм рд╢реЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдЬреАрдпреВрдЖрдИ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ [
1 ] рдореЗрдВ рдХрд┐рдпрд╛ рдерд╛ред
рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐
рдЗрд╕ рдкрд╛рда рдФрд░ рдмрд╛рдХреА рдХреЗ рдмреАрдЪ рдХрд╛ рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рдореИрдВ рдХреЗрд╡рд▓ рдорд╛рдирдХ рдЧреЛ рд╕рдВрдХреБрд▓ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реВрдВрдЧрд╛ред рдореЗрд░реЗ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рд╕реЗ рдЕрдзрд┐рдХ рдерд╛, рдФрд░ рдореБрдЭреЗ рдХрд┐рд╕реА рднреА рд░реВрдкрд░реЗрдЦрд╛ рдХреЛ рд╕рдордЭрдиреЗ рдХреА рдЗрдЪреНрдЫрд╛ рдирд╣реАрдВ рдереА (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Revel [
2 ])ред рдЗрд╕рд▓рд┐рдП рдореИрдВ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рд╡рд┐рд╖рдп рдкрд░ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдлрд┐рд▓рд╣рд╛рд▓, рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдХрд┐рд╕реА рд╕рд░реНрд╡рд░ рдкрд░ рдлрд╝рд╛рдЗрд▓ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рд╕реНрдкрд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдореИрдВрдиреЗ рдПрдХ рд▓реЗрдЦ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдЬреЛ рд╣рдореЗрдВ рдЖрдЧреЗ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдВрдХрд╛рд▓ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред
рдХреЛрдб рдХреА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдХрдореА рдХреЗ рдХрд╛рд░рдг, рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ, рдореИрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдирд╣реАрдВ рд╕рдВрднрд╛рд▓реВрдВрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рддреБрдЪреНрдЫ рдЪреАрдЬреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛, рдЬреИрд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рддрд░реНрдХ (рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рджреЗрдЦреЗрдВ [
3 ] [
4 ])ред рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП, рдХреБрдЫ рдмрд┐рдВрджреБрдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрдбрд╝рд╛рдИ рд╕реЗ рдФрдкрдЪрд╛рд░рд┐рдХ рднрд╛рд╖рд╛ рдореЗрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ рдмрд┐рд▓реНрдХреБрд▓ рд╕рдЪ рдирд╣реАрдВ рд╣реИред
рд╢реБрд░реБрдЖрдд
рдЖрдЗрдП рд╕рд░рд▓ рд╣реИрд▓реЛ рд╡рд░реНрд▓реНрдб рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░реЗрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рд╣реИрдВрдбрд▓рд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
func index(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-type", "text/plain") w.Write([]byte("Hello World!!!")) }
рдлрд╝рдВрдХреНрд╢рди рдХреЗ рддрд░реНрдХ
ResponseWriter рдФрд░
рдЕрдиреБрд░реЛрдз рд╣реИрдВ ред
ResponseWriter - рдпрд╣ рд╡рд╣ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ HTTP рдкреНрд░рддрд┐рд╕рд╛рдж рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ,
рдЕрдиреБрд░реЛрдз - рд╕рд░реНрд╡рд░ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╛рдкреНрдд HTTP рдЕрдиреБрд░реЛрдз рдпрд╛ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рднреЗрдЬреЗ рдЬрд╛рдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рд╣реИред рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ, рд╣реЗрдбрд░ рдореЗрдВ рд╣рдо рд╕рд╛рдордЧреНрд░реА рдкреНрд░рдХрд╛рд░ рдХреЛ "рд╕рд╛рджреЗ рдкрд╛рда" рдкрд░ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рд╣рдо рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдЕрдкрдиреА рд▓рд╛рдЗрди рднреЗрдЬрддреЗ рд╣реИрдВред
рдЖрдЧреЗ рд╣рдореЗрдВ рдЗрд╕ рд╣реИрдВрдбрд▓рд░ рдХреЛ "рдмрд╛рдВрдзрдирд╛" рдЪрд╛рд╣рд┐рдП:
func main() { http.HandleFunc("/", index) http.ListenAndServe(":80", nil) }
HandleFunc рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ
рд╣реБрдП, рд╣рдо рд╣реИрдВрдбрд▓рд░ рдлрдВрдХреНрд╢рди рдХреЛ рдкреИрдЯрд░реНрди рд╕реЗ рдмрд╛рдБрдзрддреЗ рд╣реИрдВ, рдФрд░ C,
HearAndServe рдХрд╛ рдЙрдкрдпреЛрдЧ
рдХрд░рдХреЗ, рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рд░реНрд╡рд░ рдХреЛ рд╕реАрдзреЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдкреИрдЯрд░реНрди рдХреЛрдИ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ: "/", "/ рдкреЗрдЬ 0", "/ рдкреЗрдЬ 0 / рдкреЗрдЬ 01"ред рд▓реЗрдХрд┐рди рдкреИрдЯрд░реНрди рдХреЗ рдмрд╛рдж рд╕рдм рдХреБрдЫ рдЙрд╕ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреЛ рдкреИрдЯрд░реНрди рдкрдВрдЬреАрдХреГрдд рд╣реИрдВ: тАЬ/тАЭ рдФрд░ тАЬ/ рдкреЗрдЬ 0тАЭред рдпрджрд┐ рдЖрдк рдкрддрд╛ рдмрд╛рд░ рдореЗрдВ "/ рдкреГрд╖реНрда" рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ рд╕рдВрджрд░реНрдн "/" рдФрд░ рдпрджрд┐ "/ рдкреГрд╖реНрда0 / рдкреГрд╖реНрда" рд╣реЛрдЧрд╛, рддреЛ "/ рдкреГрд╖реНрда 0" рдкрд░ рд╣реЛрдЧрд╛ред рдкреВрд░рд╛ рдХреЛрдб рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
package main import ( "net/http" ) func index(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-type", "text/plain") w.Write([]byte("Hello World!!!")) } func main() { http.HandleFunc("/", index) http.ListenAndServe(":80", nil) }
рд╣рдо рд╕рдВрдХрд▓рди рдХрд░рддреЗ рд╣реИрдВ, рдЪрд▓рд╛рддреЗ рд╣реИрдВ (рдпрд╛ рддреБрд░рдВрдд рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ), рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ, рдЙрд╕ рдкрддреЗ рдкрд░ рдЬрд╛рдПрдВ рдЬрд╣рд╛рдВ рд╕рд░реНрд╡рд░ рдЪрд▓ рд░рд╣рд╛ рд╣реИ (рд╕реНрдерд╛рдиреАрдп рдорд╢реАрди рдкрд░ рдпрд╣ рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ рд╣реИ - 127.0.0.1) рдФрд░ рд╣рдорд╛рд░реА рд▓рд╛рдЗрди рджреЗрдЦреЗрдВред
рд╣рдо рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ
рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ "рдПрдореНрдмреЗрдбреЗрдб" рдПрдЪрдЯреАрдПрдордПрд▓-рдХреЛрдб рд╕рдВрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдмреЗрд╣рдж рдмрджрд╕реВрд░рдд рдФрд░ рдмреЗрд╣рдж рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд▓рдЧрддрд╛ рд╣реИ (рд╡рд┐рд╢реЗрд╖рдХрд░ рдмрдбрд╝реА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ):
fmt.Fprint(w, "<form target=\"_blank\" action=\"/exec/\" enctype=\"multipart/form-data\" method=\"post\">"+ "<input type=\"file\" name=\"imgfile\" />"+ "<input type=\"submit\" name=\"button\" value=\"Execute\" />"+ "</form>")
рдЗрд╕рд▓рд┐рдП, рд╣рдо рдкрдардиреАрдпрддрд╛ рдФрд░ рд╕рдВрдкрд╛рджрди рдореЗрдВ рдЖрд╕рд╛рдиреА рдХреЗ рд▓рд┐рдП
рдЯреЗрдореНрдкрд▓реЗрдЯ рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдЕрдкрдиреЗ рдкреГрд╖реНрда рдХрд╛ "рдмреИрдХрдмреЛрди" рд▓рд┐рдЦреЗрдВрдЧреЗ (рдореИрдВ HTML5 рдорд╛рдирдХ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реВрдВрдЧрд╛):
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>{{.Title}}</title> </head> <body> <p>{{.Msg}}</p> </body> </html>
рд╢реАрд░реНрд╖рдХ рдФрд░
Msg рдмрд╛рдж рдореЗрдВ рдкрд╛рда рдореЗрдВ рдмрджрд▓ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдмрд╛рдж рдореЗрдВ рдЙрд╕ рдкрд░ рдФрд░ рдЕрдзрд┐рдХред рдкрд╣рд▓реЗ рд╣рдореЗрдВ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдо рдлрд┐рд░ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ:
type page struct { Title string
рдЕрдм рд╣рдо рдлрдВрдХреНрд╢рди рд╣реИрдВрдбрд▓рд░ рд▓рд┐рдЦрддреЗ рд╣реИрдВ:
func index(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-type", "text/html") t, _ := template.ParseFiles(тАЬindex.htmlтАЭ) t.Execute(w, &page{Title: "Just page", Msg: "Hello World"}) }
ParseFiles - рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдлрд╝рд╛рдЗрд▓ (рдпрд╛ рдлрд╝рд╛рдЗрд▓реЗрдВ) рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рддрд╛ рд╣реИ,
рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдбреЗрдЯрд╛ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕реЗ
w рдкрд░ рд▓рд┐рдЦрддрд╛ рд╣реИред
рдЗрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд┐рдВрдЧ
рдЕрдВрддрд┐рдо рдЪреАрдЬрд╝ рдЬреЛ рдмрдЪреА рд╣реИ, рдЙрд╕рдореЗрдВ рдХреБрдЫ рдмрдЯрди рдХреЗ рд╕рд╛рде рдПрдХ рдкреЗрдЬ рдмрдирд╛рдирд╛, рдПрдХ рдлрд╝рд╛рдЗрд▓ рдЕрдкрд▓реЛрдб рдХрд░рдирд╛, рдЖрджрд┐ред рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╕рд░реНрд╡рд░ рдЫрд╡рд┐ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдЧрд╛, рдЗрд╕реЗ рдЧреБрдгрд╡рддреНрддрд╛ 0 рдХреЗ рд╕рд╛рде рдЬреЗрдкреАрдИрдЬреА рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░реЗрдВ (рдЗрд╕рд╕реЗ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдХрд┐ рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ), рдФрд░ рдЗрд╕реЗ рд╡рд╛рдкрд╕ рд▓реМрдЯрд╛ рджреЗрдВред
POST рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рдПрдХ рдлреЙрд░реНрдо рдЬреЛрдбрд╝рдХрд░ рд╣рдорд╛рд░реЗ HTML рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рдмрджрд▓реЗрдВ:
<form target="_blank" action="/exec/" enctype="multipart/form-data" method="post"> <input type="file" name="imgfile" /> <input type="submit" name="button" value="Execute" /> </form>
рд╣рдо рдлрдВрдХреНрд╢рди рд╣реИрдВрдбрд▓рд░ рд▓рд┐рдЦрддреЗ рд╣реИрдВ:
func index(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-type", "text/html") title := r.URL.Path[len("/"):] if title != "exec/" { t, _ := template.ParseFiles("index.html") t.Execute(w, &page{Title: "Convert Image"}) } else { imgfile, fhead, _ := r.FormFile("imgfile") img, ext, _ := image.Decode(imgfile) w.Header().Set("Content-type", "image/jpeg") w.Header().Set("Content-Disposition", "filename=\"" + fhead.Filename + "." + ext + "\"") jpeg.Encode(w, img, &jpeg.Options{0}) } }
рд╢реАрд░реНрд╖рдХ рдЪрд░ рдкреИрдЯрд░реНрди рдХреЗ рдмрд╛рдж рдХреНрдпрд╛ рд╣реЛрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдкрддрд╛ "http: // localhost / qwe /" рд╣реИ, рддреЛ
рд╢реАрд░реНрд╖рдХ "qwe /" рд╣реЛрдЧрд╛ред рд╣рдо рдЖрдЧреЗ рджреЗрдЦрддреЗ рд╣реИрдВ, рдпрджрд┐ рд╣рдо "рдирд┐рд╖реНрдкрд╛рджрд┐рдд /" рдкрд░ рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рд╣рдо рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреГрд╖реНрда рдХреЛ рд▓реЛрдб, рдкреНрд░реЛрд╕реЗрд╕ рдФрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдпрджрд┐ рд╣рдо "рдирд┐рд╖реНрдкрд╛рджрди /" рдкрд░ рд╣реИрдВ, рддреЛ рд╣рдо рдЗрдирдкреБрдЯ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВред
FormFile - рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╝рд╛рдЗрд▓ рд▓реМрдЯрд╛рддрд╛ рд╣реИ (рдпрджрд┐ рдРрд╕реЗ рдХрдИ рд░реВрдк рд╣реИрдВ, рддреЛ рдкрд╣рд▓реЗ рдПрдХ) рдФрд░ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдЬрд╛рдирдХрд╛рд░реАред рд╣рдо рд╕рд╛рдордЧреНрд░реА рдкреНрд░рдХрд╛рд░ ("рдЫрд╡рд┐ / рдЬреЗрдкреАрдИрдЬреА"), рдлрд╝рд╛рдЗрд▓ рдирд╛рдо (рд╕рд░реНрд╡рд░ рдЗрд╕ рдирд╛рдо рдХреЗ рд╕рд╛рде рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рднреЗрдЬреЗрдВрдЧреЗ) рдФрд░ рдЫрд╡рд┐ рд░рд┐рдХреЙрд░реНрдб рдХрд░рддреЗ рд╣реИрдВред
рдкреВрд░реНрдг рдЙрджрд╛рд╣рд░рдг рдкрд╛рдаindex.html <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>{{.Title}}</title> </head> <body> <form target="_blank" action="/exec/" enctype="multipart/form-data" method="post"> <input type="file" name="imgfile" /> <input type="submit" name="button" value="Execute" /> </form> </body> </html>
lesson.go package main import ( "net/http" "html/template" "image" "image/jpeg" _"image/png" _"image/gif" ) type page struct { Title string Msg string } func index(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-type", "text/html") title := r.URL.Path[len("/"):] if title != "exec/" { t, _ := template.ParseFiles("index.html") t.Execute(w, &page{Title: "Convert Image"}) } else { imgfile, fhead, _ := r.FormFile("imgfile") img, ext, _ := image.Decode(imgfile) w.Header().Set("Content-type", "image/jpeg") w.Header().Set("Content-Disposition", "filename=\"" + fhead.Filename + "." + ext + "\"") jpeg.Encode(w, img, &jpeg.Options{0}) } } func main() { http.HandleFunc("/", index) http.ListenAndServe(":80", nil) }
рдФрд░ рдПрдХ рдФрд░ рдмрд╛рдд, рдпрджрд┐ рдЖрдк рдЕрдкрдиреЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рдХреБрдЫ рд╕реНрдерд╛рдиреАрдп рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдЫрд╡рд┐ рдлрд╝рд╛рдЗрд▓), рддреЛ рдЖрдкрдХреЛ рдПрдХ рд╣реИрдВрдбрд▓рд░ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ рдпрд╛
http рдкреИрдХреЗрдЬ рд╕реЗ
рдлрд╛рдЗрд▓рд╕реЗрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдкрд╣рд▓реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╣реЛрдЧрд╛:
func logo(w http.ResponseWriter, r *http.Request) { file, _ := ioutil.ReadFile("img/logo.png") w.Write(file) } <...> http.HandleFunc("/img/logo.png", logo) <...>
рдФрд░ рджреВрд╕рд░реЗ рдореЗрдВ, рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рд░ рдПрдХ рдлрд╛рдЗрд▓ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ:
<...> http.Handle("/img/", http.StripPrefix("/img/", http.FileServer(http.Dir("./img/")))) <...>
рдирд┐рд╖реНрдХрд░реНрд╖
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдореИрдВрдиреЗ рджрд┐рдЦрд╛рдпрд╛ рдХрд┐ рдЖрдк рдЕрдкрдиреЗ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЧреЛ рдкрд░ рдХрд┐рддрдирд╛ рд╕рд░рд▓ рдФрд░ рд╕рдордЭ рд╕рдХрддреЗ рд╣реИрдВред рдЧреЛ рдХреЗ рдлрд╛рдпрджреЗ рд╕реНрд╡рдпрдВ рднрд╛рд╖рд╛ рдХреА рд╕рд╛рджрдЧреА, http рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреИрдХреЗрдЬ рдХреА рд╕рд╛рджрдЧреА, рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛, рд╕рд╛рде рд╣реА рд╕рд╛рде рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдФрд░ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рд╢реБрджреНрдз рдЧреЛ рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рдХреЛрдб рдХреА рд╕реНрд╡рддрдВрддреНрд░рддрд╛ рд╣реИред рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ: FreeBSD (x86, amd64, arm), NetBSD (x86, amd64), GNU / Linux (x86, amd64, arm), MacOS X (x86, amd64), рд╡рд┐рдВрдбреЛрдЬ (x86, amd64)ред
[рез]
mapitemeditor.sourceforge.net[реи]
habrahabr.ru/post/162115[рей]
golang.org/doc[рек]
golang.org/pkg