有没有一种方法可以使用Go下载一个大文件,将内容直接存储到文件中,而不是在写入文件之前将其全部存储在内存中?由于文件如此之大,在将其写入文件之前将其全部存储在内存中将耗尽所有内存。
发布于 2012-07-28 01:50:30
我假设您是指通过http下载(为简洁起见,省略了错误检查):
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)
Reader的主体是一个Reader,所以你可以使用任何接受Reader的函数,例如,一次读取一个块,而不是一次读取所有块。在这种特定的情况下,io.Copy()
会为您做一些繁琐的工作。
发布于 2015-11-22 18:38:43
史蒂夫·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
}
发布于 2016-01-19 19:21:30
上面使用io.Copy
选择的答案正是您所需要的,但如果您对其他功能感兴趣,如恢复损坏的下载、自动命名文件、校验和验证或监控多个下载的进度,请查看grab包。
https://stackoverflow.com/questions/11692860
复制相似问题