2012-09-20 10 views
9

Estoy tratando de configurar un servidor web muy simple donde el usuario accede a un sitio y escribe una cadena y un int. Luego quiero guardar estos dos entradas, mi idea era hacerlo a un archivo de texto que también se puede mostrar en el navegador: .../archivo de texto/Cómo leer la entrada de un formulario HTML y guardarlo en un archivo - Golang

No sé cuál es la norma en SO sobre la cantidad de código que está bien para puesto, pero esto es lo que tengo hasta ahora:

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) 

} 

Y mi HTML formulario: (sin todo el formateo)

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

Así que mi idea inicial era implementar dos funciones, returnInput() y saveInput() pero ¿tal vez hay algunas funciones incorporadas que son más fáciles de usar?

¡Si alguien pudiera indicarme en la dirección correcta cómo guardar la entrada del formulario HTML, sería muy agradecido! Gracias por adelantado.

Respuesta

13

Deberá elegir un formato para escribir en el archivo. Vamos a elegir JSON sin ninguna razón en particular. Así que dada una forma como:

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

que podría tener el siguiente controlador

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

Gracias, fue muy útil. He estado intentando con el FormValue, pero como soy muy nuevo en la programación, me perdí un poco la codificación. Pero me lo dijiste muy claro. – miner

+1

Claro, revise los documentos del paquete en la codificación, http://golang.org/pkg/encoding/ Podría, por ejemplo, leer/escribir la estructura sin procesar con la codificación/paquete binario si eso es lo que desea. JSON es solo un buen término medio para explicar algo e inspeccionar el resultado fácilmente. – dskinner

Cuestiones relacionadas