Câu trả lời:
Tôi giả sử ý bạn là tải xuống qua http (bỏ qua kiểm tra lỗi cho ngắn gọn):
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)
Phần thân của http.Response là một Trình đọc, vì vậy bạn có thể sử dụng bất kỳ chức năng nào đưa Trình đọc, chẳng hạn như đọc một đoạn cùng một lúc chứ không phải tất cả cùng một lúc. Trong trường hợp cụ thể này, io.Copy()
không có gì khó khăn cho bạn.
client := http.Client{Timeout: 10 * time.Second,} client.Get("http://example.com/")
Một phiên bản mô tả nhiều hơn câu trả lời của Steve M.
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
}
Câu trả lời được chọn ở trên bằng cách sử dụng io.Copy
chính xác những gì bạn cần, nhưng nếu bạn quan tâm đến các tính năng bổ sung như tiếp tục tải xuống bị hỏng, tự động đặt tên tệp, xác thực tổng kiểm tra hoặc theo dõi tiến độ của nhiều lần tải xuống, hãy xem gói lấy .
Đây là một mẫu. https://github.com/thbar/golang-playground/blob/master/download-files.go
Ngoài ra, tôi cung cấp cho bạn một số mã có thể giúp bạn.
mã:
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()
. Điều đó tốt, miễn là bạn đang xử lý các tệp nhỏ.
io.Copy
đọc 32kb (tối đa) từ đầu vào và ghi chúng vào đầu ra, sau đó lặp lại. Vì vậy, đừng lo lắng về bộ nhớ.