2013-05-21 25 views
12

Tôi muốn viết một máy chủ web đơn giản khi thực hiện như sau: khi tôi truy cập http://example.go:8080/image, nó trả về một hình ảnh tĩnh. Tôi đang theo dõi một ví dụ tôi đã tìm thấy here. Trong ví dụ này, họ thực hiện phương pháp này:go-lang máy chủ web đơn giản: phục vụ hình ảnh tĩnh

func handler(w http.ResponseWriter, r *http.Request) { 
    fmt.Fprintf(w, "Hi there, I love %s!", r.URL.Path[1:]) 
} 

và sau đó đề cập đến nó ở đây:

... 
... 
http.HandleFunc("/", handler) 

Bây giờ, những gì tôi muốn làm là phục vụ một hình ảnh thay vì văn bản cho chuỗi. Làm thế nào tôi sẽ đi về điều đó?

Trả lời

21

Bạn có thể phân phát tệp tĩnh bằng chức năng http.FileServer.

package main 

import (
    "log" 
    "net/http" 
) 

func main() { 
    http.Handle("/", http.StripPrefix("/", http.FileServer(http.Dir("path/to/file")))) 
    if err := http.ListenAndServe(":8080", nil); err != nil { 
     log.Fatal("ListenAndServe: ", err) 
    } 
} 

EDIT: Thêm idiomatic mã.

EDIT 2: Đoạn mã này trên sẽ trả về một hình ảnh image.png khi trình duyệt yêu cầu http://example.go/image.png

Các http.StripPrefix chức năng ở đây là đúng không cần thiết trong trường hợp này là con đường được xử lý là gốc rễ web. Nếu hình ảnh được phân phối từ đường dẫn http://example.go/images/image.png thì dòng trên sẽ cần phải là http.Handle("/images/", http.StripPrefix("/images/", http.FileServer(http.Dir("path/to/file")))).

Playground

+0

cảm ơn rất nhiều! bạn có thể thêm một vài từ về những gì các StripPrefix và FileServer có nghĩa là và được sử dụng trong bối cảnh này? – levtatarov

+1

StripPrefix không thực sự cần thiết trong trường hợp này khi bạn đang phục vụ từ thư mục gốc của máy chủ web. Nó thực sự cần thiết khi bạn muốn máy chủ từ một con đường khác nhau. Hãy xem http://golang.org/pkg/net/http/#StripPrefix và http://golang.org/pkg/net/http/#FileServer. – Intermernet

Các vấn đề liên quan