【问题标题】:Gorilla/mux: Image not displaying大猩猩/多路复用器:图像未显示
【发布时间】:2016-05-12 07:26:42
【问题描述】:

我是 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 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

【问题讨论】:

  • 图片标签本身是 404 的?还是整个页面?您也没有显示照片的来源。我认为这是您的视图模型的属性?是网址吗? .Photo 的价值是多少?
  • @David Budworth 页面正在加载。图像显示为损坏的图像链接。图片链接来自数据库。当我拍摄 tdate image li
  • (对不起,不小心点击了发布按钮..)当我接受检查元素图像链接时。但是当我尝试打开链接时,它给了我一个 404。链接在图像上传时存储在数据库中。我会尽快添加代码。
  • 你正在从前端的任何部分目录运行你的应用程序?
  • 另外,刚刚注意到。您创建了一个 mux.NewRouter 但从不将其传递给监听和服务。您目前正在混合使用 gorilla 和 stdlib http muxes

标签: go


【解决方案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(更灵活的解决方案,但考虑到您的示例代码并非真正必要),则将其而不是 nil 传递给 ListenAndServe。

【讨论】:

  • 谢谢哥们。我已按照您的指示更改了代码。但是图像问题仍然存在。使用 {{.Photo}} 的新代码和值编辑了问题
  • 当你启动你的应用程序时,你的 shell 位于 ./frontend/images/ 的父目录中?照片网址是什么(img标签来源)?
  • 我的照片路径存储在数据库中。 {{.Photo}} 旨在将不同的图像填充到列表中。当我登录到列表页面时,它应该显示以前上传的不同照片。我设法在我的数据库中传递了在照片上传时插入的不同路径。希望这是你问的。
  • 我的意思是,从字面上看,当你运行你的应用程序时,你在哪个目录中。当您告诉 fileserver ./frontend/images 时,这意味着“从我运行我的应用程序时所在的位置开始”,而不是“相对于我的源代码”。我要的是一个 url 的确切示例(没有主机名)... le: /images/foo.png。下一步是询问您是否可以(从您的 bash 或 cmd 提示符)键入 ls(或 dir)./frontend/images/foo.png 并找到它。因为,如果没有,你会得到一个 404
猜你喜欢
  • 2021-11-21
  • 2018-12-01
  • 2018-06-08
  • 2015-01-11
  • 2014-03-15
  • 2021-04-08
  • 1970-01-01
  • 1970-01-01
  • 2015-11-20
相关资源
最近更新 更多