-1

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

有没有简单的方法(只有几个文件而不是创建“典型的 go web 项目文件结构”)在 go 模板中显示带有图像的 HTML?我相信下面的问题基本上与 http 处理程序有关。要么我可以有一个文本处理程序或图像处理程序,但不能两者兼而有之?我需要两者,这样我就可以从 HTML 表单中获得用户控制,将显示哪个图像。

如果有人可以提供帮助,我将不胜感激。

R乔

--已修改抱歉不清楚。我对 go 模板的经验有限,并且我看到过很多例子,人们使用 go app 项目文件结构,这些文件结构可能包括模板、img 等目录。这些目录通常有 10 个或更多。然后他们谈论在应用程序中使用路线以及我不敢涉足的其他事情。

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

我想象一个单一的go程序(1个文件)可以接收数字,一旦收到就改变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>
4

1 回答 1

0

handler中有注册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)
    }
}
于 2019-06-12T16:37:48.227 回答