9

ユーザーがサイトにアクセスして文字列とintを書き込む非常に単純なWebサーバーをセットアップしようとしています.次に、これら2つの入力を保存したいと思います.ブラウザ: .../textfile/

投稿できるコードの量に関する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() の 2 つの関数を実装することでしたが、使いやすい組み込み関数がいくつかあるのではないでしょうか?

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 に答える