使用HTML表单部分显示图像文件的简单方法

时间:2019-06-11 20:44:00

标签: html go go-templates

我一直在玩很多go服务器片段,试图弄清楚如何在HTML文件中显示图像文件或与HTML表单部分一起显示HTTP模板。基本上,如果我使用go模板,则最大的问题是我无法与html一起显示图像,并且仍然使项目规模较小。看来,使模板正常工作的唯一方法是将代码组织成一个我试图避免的“典型的HTML项目”。

是否有任何简单的方法(只有几个文件,并且没有创建“典型的go web项目文件结构”)来显示带有go模板中的图像的HTML?我相信下面的问题基本上是http处理程序。我可以拥有文本处理程序或图像处理程序,但不能同时拥有两者吗?我需要两者,所以我可以从HTML表单中控制要显示图像的用户。

如果有人能帮助我,我将非常感激。

R 乔

-修订 很抱歉不清楚。我对go模板的经验有限,并且我看到了许多使用go app项目文件结构的示例,这些文件结构可能包含模板,img等目录。这些目录通常为10个或更多。然后他们谈论在应用程序内使用路由以及其他我胆怯要进入的事物。

我只是想简单地查看我想做的事情。我大约有70张图片。我只想要一种方法,用户可以单击显示图像的html页面,并仅根据显示的图像提供数字1,2,3,4作为反馈。

我想象过一个go程序(一个文件)可以接收数字,并且一旦接收到,就可以更改html页面上的img,或者允许用户单击下一个超链接或某些内容以显示下一个图像,并且在结束后程序停止。

package main
import (

"fmt"
"html/template"
"log"
"net/http"
//"strings"



func img(w http.ResponseWriter, r *http.Request) {

//http.Handle("/images/", http.StripPrefix("/images/", http.FileServer(http.Dir("images/"))))

fmt.Println("method:", r.Method) //get request method

if r.Method == "GET" {
    t, _ := template.ParseFiles("image.gtpl")
    t.Execute(w, nil)
} else {
    r.ParseForm()
    // logic part of log in
    fmt.Println("previmage:", r.Form["previmage"])
    fmt.Println("nextimage:", r.Form["nextimage"])
}
}

func main() {

//http.HandleFunc("/", sayhelloName) // setting router rule
http.HandleFunc("/login", login)
err := http.ListenAndServe(":9090", nil) // setting listening port
if err != nil {
    log.Fatal("ListenAndServe: ", err)
}
}

<html>
<head>
<title></title>
</head>
<body> //How to Loop Images based on user submit??
<img src="img/question4.png" alt="Cannot load image" style="width: 800px;height: 800px">
    <form action="/login" method="post">
        Username:<input type="text" name="previmage">
        Password:<input type="password" name="nextimage">
        <input type="submit" value="Login">
    </form>
</body>
</html>

1 个答案:

答案 0 :(得分:0)

您有自己的http.Handle调用,该调用注册处理程序,在处理程序内部。这意味着每次请求进入时,它都会尝试再次注册处理程序 。不允许这样做(因此出现错误,该错误明确表示您无法重新注册相同的路由)。您应该在注册模板处理程序的位置,即main中注册它:

func main() {
    http.HandleFunc("/login", login)
    // Register handler correctly
    // I changed the route to /img/ to match what you're using in your HTML
    http.Handle("/img/", http.StripPrefix("/img/", http.FileServer(http.Dir("images/"))))
    err := http.ListenAndServe(":9090", nil) // setting listening port
    if err != nil {
        log.Fatal("ListenAndServe: ", err)
    }
}