2012-09-20 7 views
9

Sto provando a configurare un server Web molto semplice in cui l'utente accede a un sito e scrive una stringa e un int. Quindi voglio salvare questi due input, la mia idea era di farlo su un file di testo che può essere visualizzato anche nel browser: .../textfile/Come leggere l'input da un modulo HTML e salvarlo in un file - Golang

Non so quale sia la norma su SO su quanto codice è OK per post, ma qui è quello che ho finora:

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) 

} 

E il mio HTML-forma: (senza tutta la formattazione)

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

Quindi il mio primo pensiero è stato quello di implementare due funzioni returnInput() e saveInput() ma forse ci sono alcune funzioni incorporate che sono più facili da usare?

Se qualcuno potrebbe indicarmi la giusta direzione su come salvare l'input dal modulo HTML, sarei molto grato! Grazie in anticipo.

risposta

13

Avrai bisogno di scegliere un formato per scrivere sul file. Prendiamo JSON senza motivo in particolare. Così dato una forma come:

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

si potrebbe avere il seguente gestore

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

Grazie, è stato davvero utile. Avevo provato con FormValue ma dato che sono molto nuovo alla programmazione, ho perso il bit sulla codifica. Ma l'hai reso molto chiaro a me. – miner

+1

Certo, controlla i documenti pkg sulla codifica, http://golang.org/pkg/encoding/ Si potrebbe ad esempio leggere/scrivere la struttura grezza con codifica/pkg binario se è ciò che si desidera. JSON è solo una buona via di mezzo per spiegare qualcosa e ispezionare facilmente il risultato. – dskinner

Problemi correlati