我是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
答案 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。