2016-05-03 27 views
5

ho i modelli GO (upload.tmpl.html) come questo:E 'possibile associare un canale golang in un modello

un gestore uploadHandler.go con

func UploadHandler(c *gin.Context) { 
    file, header, err := c.Request.FormFile("file-upload") 
    if err != nil { 
     log.Fatal("Erreur dans la récupération de fichier") 
    } 
    //... 
    fileName := make(chan string) 

    go ReadCsvFile(bytes, fileName) 
    go func() { 
     for { 
      log.Info(<-fileName) 
     } 
    }() 

    c.HTML(http.StatusOK, "upload.tmpl.html", gin.H{ 
     "fileName": <-fileName, 
    }) 
} 

e il metodo ReadCsvFile() così:

func ReadCsvFile(bytesCSV []byte, fileName chan string) { 
    r := bytes.NewReader(bytesCSV) 
    reader := csv.NewReader(r) 
    reader.Comma = ';' 

    records, err := reader.ReadAll() 

    if err != nil { 
     fmt.Println("Error:", err) 
     return 
    } 

    db, _ := databaseApp.OpenDatabase() 
    defer db.Close() 
    for _, record := range records { 
     fileName <- record[0] 
     product := &em.Product{ 
      Name:  record[0], 
      //... 
     } 
     db.Create(product) 

    } 
    fileName <- "done" 
} 

Provo a visualizzare il file correnteNome o f ogni riga nel modello, ma è possibile associare il canale al modello in questo modo? Perché in questo modo la pagina non viene più caricata.

+1

dopo il rendering tutto puoi fare "aggiornare" la pagina usando ajax/js – dit

risposta

2

Utilizzare Websockets. Ecco alcuni esempi:

HTML/JavaScript:

<script> 
    var ws= new WebSocket("ws://yoursite.com"); 
    ws.onmessage = function (event) { 
     console.log(event.data); 
     // $('#your-element').html(event.data); 
    } 
</script> 

Go WebSockets:

func websocketSenderHandler(conn *websocket.Conn){ 
    for { 
     msg := <- globalChannel 
     conn.WriteMessage(websocket.TextMessage, msg) 
    } 
} 

Più WebSockets in Go: golang.org/x/net/websocket

Altro Esempio: https://github.com/golang-samples/websocket

+0

Spiacente, non dovrebbe essere "websocket.Message.Send (conn, & msg)'? Non riesco a vedere una funzione 'WriteMessage()', solo un 'Write()' che è usato per essere compatibile con l'interfaccia 'io.Write()'? –

+1

Basato su questo [problema] (https://github.com/golang/go/issues/18152) e [commit] (https://github.com/golang/net/commit/97edce0b2e423f6a8debb459af47f4a3cb4ff954) utilizzando il pacchetto std websocket isn è una buona idea. [Gorilla websocket] (github.com/gorilla/websocket) è più preferibile. –

+0

@olegkovalov il mio esempio è gorilla websocket. – dit