2014-06-09 24 views
13

mio codice del file ottenere da URL remoto e download del file in del browser:golang - come scaricare il file nel browser dal server golang?

func Index(w http.ResponseWriter, r *http.Request) { 
    url := "http://upload.wikimedia.org/wikipedia/en/b/bc/Wiki.png" 

    ... 

    resp, err := client.Get(url) 
    if err != nil { 
     fmt.Println(err) 
    } 
    defer resp.Body.Close() 

    body, err := ioutil.ReadAll(resp.Body) 
    if err != nil { 
     fmt.Println(err) 
    } 

    fmt.Println(len(body)) 
    //download the file in browser 

} 

func main() { 
    http.HandleFunc("/", Index) 
    err := http.ListenAndServe(":8000", nil) 

    if err != nil { 
     fmt.Println(err) 
    } 
} 

codice: http://play.golang.org/p/x-EyR2zFjv

file di Get è ok, ma come scaricato nel browser?

Grazie.

+0

qual è il cliente in codice sopra ?? –

risposta

33

per rendere il browser aprire la finestra di download, aggiungere un Content-Disposition e Content-Type intestazioni alla risposta:

w.Header().Set("Content-Disposition", "attachment; filename=WHATEVER_YOU_WANT") 
w.Header().Set("Content-Type", r.Header.Get("Content-Type")) 

fare questo prima di inviare il contenuto al client. Si potrebbe anche voler copiare l'intestazione Content-Length della risposta al client, per mostrare il progresso corretto.

per lo streaming il corpo risposta al client senza caricare completamente nella memoria (per file di grandi dimensioni questo è importante) - è sufficiente copiare il lettore corpo allo scrittore risposta:

io.Copy(w, resp.Body) 

io.Copy è una funzione bel po ' che prende un'interfaccia di lettura e un'interfaccia di scrittura, legge i dati da uno e li scrive sull'altro. Molto utile per questo genere di cose!

ho modificato il codice per fare questo: http://play.golang.org/p/v9IAu2Xu3_

+5

Assicurati di avvolgere il nome del file = arg con le virgolette se hai spazi nel nome del file, ad es. 'filename =" QUELLO CHE VUOI "'. – kainjow