大猩猩/多路复用:图像不显示

时间:2016-02-03 07:50:41

标签: go

我是Golang的新手。我需要显示图像。我尝试过使用Gorilla / mux。 但我仍然得到错误:404。我可能是我使用mux代码不正确的地方。

主要功能

    package main
    import (
        "net/http"
        "mytestsite/handlers"
         "log"
         "github.com/gorilla/mux"
     )


    func main() {

    r := mux.NewRouter()
    r.HandleFunc("/register", handlers.RegisterHandler)
    r.HandleFunc("/sucess", handlers.Sucess)
    r.HandleFunc("/login", handlers.Login)
    r.HandleFunc("/list", handlers.ViewList)
    r.HandleFunc("/logout", handlers.Logout)
    r.HandleFunc("/edit", handlers.Edit)
    r.HandleFunc("/EditnList", handlers.EditnList)
    r.HandleFunc("/notvalid", handlers.NotValid)
    r.HandleFunc("/delete", handlers.Delete)
    r.HandleFunc("/listchoose", handlers.ListChoose)
    r.HandleFunc("/email", handlers.SendEmail)
    images := http.StripPrefix("/images/", http.FileServer(http.Dir("./frontend/images/")))
    r.PathPrefix("/images/").Handler(images)

    if err := http.ListenAndServe(":8181", r); err != nil {
        log.Fatal("http.ListenAndServe: ", err)
    }        
}

将数据传递给html的Func

func ViewList(w http.ResponseWriter, r *http.Request) {
    viewModel:=viewmodels.RegisterViewModel{}
    user:=models.User{}
    dbResults := user.ViewDB() 

    //Cookies below
    cookieCheck := getCookie(r)

    if (cookieCheck != ""){
        err:=GetTemplate("list").Execute(w,dbResults)
        if err!=nil{
            panic(err)
        }
    } else { 
        viewModel.ErrorMessage="Please Enter Email Id and Password.."
        err:=GetTemplate("login").Execute(w,viewModel)
        if err!=nil{
            panic(err)
        }
    }
}

在html文件中的用法

<td><img src="{{.Photo}}" alt="{{.Photo}}" style="width:50px;height:50px;"/></td>

{{.Photo}}的值通过以下代码存储到Db:

ctime := time.Now()
uploadedfile := "frontend/images"+ctime.Format("20060102150405")+".jpg"
out, err := os.Create(uploadedfile)

{{.Photo}}的SO值如下所示

frontend/images/20160202171411.jpg

1 个答案:

答案 0 :(得分:1)

你在这里混合两个路由器。

首先,http包有一个名为DefaultServeMux的包全局默认处理程序。这是http.ServeMux

的一个实例

当您致电http.HandleFunc时,DefaultServeMux是该处理程序注册的地方(source

当您调用http.ListenAndServe时,第二个参数是用于指定端口上的HTTP请求的处理程序。

如果你传递nil作为处理程序(就像你在代码中那样),你告诉http服务器使用http.DefaultServeMux

Gorilla mux是http.ServeMux的替代品。通常,您使用其中一种。

在您的情况下,您使用gorilla mux注册文件服务器,但随后告诉http.ListenAndServe使用http.DefaultServeMux(通过省略处理程序)。

您可以使用标准http库的默认多路复用器(通过:http.Handle)注册文件服务器,也可以更改功能映射以注册Gorilla多路复用器(通过:r.HandlerFunc)。

如果您选择使用Gorilla(更灵活的解决方案,但根据您的示例代码并不是必需的话),那么将其传递给ListenAndServe而不是nil。