2013-06-25 25 views
5

Mogę zrobić coś jak poniżej, co daje mi klasę odpowiedzi, ale nie jestem do końca pewien, jak napisać plik io.reader do pliku. Jaki jest najprostszy sposób?Najprostszy sposób na pobranie pliku?

http.Get("https://www.domain.com/some.jpg") 

Odpowiedz

8

Jeśli plik jest na tyle mała, najprostszym rozwiązaniem jest użycie ioutil.WriteFile połączeniu z ioutil.ReadAll:

resp, err := http.Get("your url") 
bytes, err := ioutil.ReadAll(resp.Body) 
err = ioutil.WriteFile(filename, bytes, 0666) 

Jeśli plik nie jest tak mała, lepiej unikać tworzenia i wypełniania bytes szyk. Następnie należy użyć io.Copy który po prostu kopiuje bajtów z czytnika pisarza:

resp, err := http.Get("your url") 
f, err := os.Create(filename) 
defer f.Close() 
_, err := io.Copy(f, resp.Body) 

Należy dodać odpowiednią obsługi błędów w obu przypadkach.

+0

Naprawdę chciałbym zdementować "ioutil.ReadAll" - prawie nigdy nie jest to, co chcesz zrobić w dobrze zachowanej aplikacji. – Dustin

+0

@Dustin Jeśli plik jest wystarczająco mały, myślę, że to nie ma znaczenia. Czy uważasz, że powinienem położyć większy nacisk na ten punkt? –

+0

Nie zgadzam się z tobą, ale być może wersja io.Copy powinna być pierwsza. Myślę, że twój kod i rozumowanie są poprawne (chociaż mogłem zrobić coś nieprzyjemnego dla twojego programu). Po prostu boję się, że zobaczę więcej ludzi robiących coś "wciągaj wszystko do pamięci". – Dustin

Powiązane problemy