Yanıtlar:
Http üzerinden indirmeyi kastettiğinizi varsayacağım (kısa olması için hata kontrolleri atlanmıştır):
import ("net/http"; "io"; "os")
...
out, err := os.Create("output.txt")
defer out.Close()
...
resp, err := http.Get("http://example.com/")
defer resp.Body.Close()
...
n, err := io.Copy(out, resp.Body)
Http.Response'nin Gövdesi bir Okuyucu'dur, bu nedenle, bir Okuyucuya götüren herhangi bir işlevi, örneğin bir kerede okumak yerine her seferinde bir bölümü okumak için kullanabilirsiniz. Bu özel durumda, io.Copy()
homurtu sizin için çalışıyor.
client := http.Client{Timeout: 10 * time.Second,} client.Get("http://example.com/")
Steve M'nin cevabının daha açıklayıcı bir versiyonu.
import (
"os"
"net/http"
"io"
)
func downloadFile(filepath string, url string) (err error) {
// Create the file
out, err := os.Create(filepath)
if err != nil {
return err
}
defer out.Close()
// Get the data
resp, err := http.Get(url)
if err != nil {
return err
}
defer resp.Body.Close()
// Check server response
if resp.StatusCode != http.StatusOK {
return fmt.Errorf("bad status: %s", resp.Status)
}
// Writer the body to file
_, err = io.Copy(out, resp.Body)
if err != nil {
return err
}
return nil
}
Yukarıda seçilen cevap io.Copy
tam olarak ihtiyacınız olan şeydir, ancak bozuk indirmeleri sürdürme, dosyaları otomatik adlandırma, sağlama toplamı doğrulama veya birden fazla indirmenin ilerlemesini izleme gibi ek özelliklerle ilgileniyorsanız, kapma paketini kontrol edin .
İşte bir örnek. https://github.com/thbar/golang-playground/blob/master/download-files.go
Ayrıca size yardımcı olabilecek bazı kodlar veriyorum.
kod:
func HTTPDownload(uri string) ([]byte, error) {
fmt.Printf("HTTPDownload From: %s.\n", uri)
res, err := http.Get(uri)
if err != nil {
log.Fatal(err)
}
defer res.Body.Close()
d, err := ioutil.ReadAll(res.Body)
if err != nil {
log.Fatal(err)
}
fmt.Printf("ReadFile: Size of download: %d\n", len(d))
return d, err
}
func WriteFile(dst string, d []byte) error {
fmt.Printf("WriteFile: Size of download: %d\n", len(d))
err := ioutil.WriteFile(dst, d, 0444)
if err != nil {
log.Fatal(err)
}
return err
}
func DownloadToFile(uri string, dst string) {
fmt.Printf("DownloadToFile From: %s.\n", uri)
if d, err := HTTPDownload(uri); err == nil {
fmt.Printf("downloaded %s.\n", uri)
if WriteFile(dst, d) == nil {
fmt.Printf("saved %s as %s\n", uri, dst)
}
}
}
ioutil.ReadAll()
. Küçük dosyalarla uğraştığınız sürece sorun değil.
io.Copy
girişten 32 KB (maksimum) okur ve çıkışına bunları yazıyor, sonra tekrarlar. Bu yüzden hafıza konusunda endişelenme.