2012-09-20 22 views
9

Kullanıcının bir siteye erişip bir dize ve bir int yazdığı çok basit bir web sunucusu kurmaya çalışıyorum. Bunu kaydetmek istiyorum. iki giriş, benim düşüncem, tarayıcıda da görüntülenebilen bir metin dosyasına yapmaktı: .../textfile/Bir HTML formundan girdi okuma ve bir dosyaya kaydetme - Golang

SO üzerinde ne tür bir kodun ne kadar kodda olduğunu bilmiyorum

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) 

} 

Ve HTML formu:: post ama burada bugüne kadar ne olduğunu (bütün biçimlendirme olmadan)

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

Bu nedenle, ilk düşüncelerimi returnInput() ve saveInput() işlevlerinin iki işlevi yerine getirmesi gerekiyordu, ancak belki de kullanımı kolay olan işlevlerde som var mı?

Eğer birisi, HTML formundaki girdiyi nasıl kaydedeceğime dair bana doğru yönde işaret ederse, ben çok müthiş olurdu! Şimdiden teşekkürler.

cevap

13

Dosyaya yazmak için bir format seçmeniz gerekecek. Özellikle de hiçbir sebepten dolayı JSON'u seçelim. Yani benzer bir form verilmiş: Aşağıdaki Handler

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) 
} 
+0

Tanklarının olabilir

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

, gerçekten yardımcı oldu. FormValue ile deniyordum ama programlama için çok yeni olduğum için kodlama hakkında biraz özledim. Ama sen bunu bana çok açık hale getirdin. – miner

+1

Elbette, kodlamada pkg belgelerini kullanıma sunma, http://golang.org/pkg/encoding/ Örneğin, istediğin buysa kodlama/ikili pkg ile ham yapısını okuyabilir/yazabilirsiniz. JSON, bir şeyi açıklamak ve sonucu kolayca incelemek için sadece güzel bir orta yoldur. – dskinner

İlgili konular