9

我正在尝试设置一个非常简单的 Web 服务器,用户可以在其中访问一个站点并写入一个字符串和一个 int。然后我想保存这两个输入,我的想法是将它保存到一个也可以显示的文本文件中浏览器:.../文本文件/

我不知道关于可以发布多少代码的 SO 规范是什么,但这是我目前所拥有的:

type Person struct {
    name  string
    hours int
}

const filename string = "timelister"

func upload(w http.ResponseWriter, r *http.Request) {
    t, _ := template.ParseFiles("upload.html")
    t.Execute(w, nil)
}

func (person *Person) open() {
    newFilename := filename + ".txt"
    _, err := os.OpenFile(newFilename, os.O_RDWR|os.O_APPEND|os.O_CREATE, 0666)
    if err != nil {
        log.Fatal("Open Filename: ", err)
    }
}

func returnInput() //want to implement this
func saveInput() //want to implemet this


func main() {
    http.HandleFunc("/", upload)
    http.ListenAndServe(":8080", nil)

}

还有我的 HTML 表单:(没有所有格式)

     Name: <input type="text" name="Name">
        <input type="submit" value="submit"></br>
     Hours: <input type="text" name="Hours">
            <input type="submit" value="submit">

所以我最初的想法是实现两个函数 returnInput() 和 saveInput() 但也许有一些更易于使用的内置函数?

如果有人能指出我如何从 HTML 表单中保存输入的正确方向,那我将非常感激!提前致谢。

4

1 回答 1

13

您需要选择一种格式来写入文件。让我们无缘无故地选择 JSON。所以给出如下形式:

<form action="/save" method="post"> ... </form>

你可以有以下处理程序

import (
    "strconv"
    "http"
    "os"
    "encoding/json"
)

type Data struct {
    Name string
    Hours int
}

func save(w http.ResponseWriter, r *http.Request) {
    name := r.FormValue("Name")
    hours, err := strconv.Atoi(r.FormValue("Hours"))
    if err != nil {
        http.Error(w, err.Error(), 500)
        return
    }

    data := &Data{name, hours}

    b, err := json.Marshal(data)
    if err != nil {
        http.Error(w, err.Error(), 500)
        return
    }

    f, err := os.Open("somefile.json")
    if err != nil {
        http.Error(w, err.Error(), 500)
        return
    }

    f.Write(b)
    f.Close()
}

func init() {
    http.HandleFunc("/save", save)
}
于 2012-09-20T14:10:05.953 回答