2014-06-09 21 views
13

Mój kod get plik ze zdalnego adresu URL i pobierania pliku w przeglądarce:golang - jak pobrać plik w przeglądarce z serwera 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) 
    } 
} 

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

plik Get jest ok, ale jak go pobrać w przeglądarce?

Dzięki.

+0

co jest klient w powyższym kodzie ?? –

Odpowiedz

33

Aby przeglądarka otworzyć okno pobierania, dodać Content-Disposition i Content-Type nagłówki z odpowiedzią:

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

Zrób to przed wysłaniem treści do klienta. Możesz również skopiować nagłówek odpowiedzi do klienta, aby pokazać prawidłowy postęp.

Jak strumieniowo ciało odpowiedź do klienta bez pełnego załadowanie go do pamięci (w przypadku dużych plików to ważne) - wystarczy skopiować czytelnika ciała pisarza odpowiedzi:

io.Copy(w, resp.Body) 

io.Copy jest ładny mały funkcja które wymagają interfejsu czytnika i interfejsu pisarskiego, odczytują dane z jednego i zapisują je na drugim. Bardzo przydatne dla tego rodzaju rzeczy!

Mam zmodyfikowany kod, aby to zrobić: http://play.golang.org/p/v9IAu2Xu3_

+5

Upewnij się, że nazwa pliku = arg zawiera cudzysłów, jeśli w nazwie pliku znajdują się spacje, np. 'filename =" WHATEVER TY CHCESZ "'. – kainjow